JAVA第二周学习笔记

文章目录

  • JAVA第二周学习笔记
  • IDEA
  • 方法
    • 格式
    • 带参数及返回值的方法
    • 方法的重载
    • 方法的内存
  • 二维数组
    • 静态初始化
    • 动态初始化
  • 面向对象
    • 类和对象
    • 如何定义类
    • 如何得到对象
    • 注意
  • 封装
    • 封装的优点
    • private关键字
    • 成员变量和局部变量
  • this关键字
  • 构造方法
    • 作用
    • 类型
    • 特点
    • 执行时机
    • 定义
    • 重载
  • 标准javabean
  • 对象内存图
  • API
  • 字符串
    • 创建Sting对象
    • 存储的内存原理
    • 常用方法
      • 字符串比较
      • 字符串遍历
      • 字符串截取
      • 字符串替换
    • SpringBulider
      • 构造方法
      • 常用方法
    • 链式编程
    • StringJoiner
      • 构造方法
      • 成员方法
    • 字符串原理
      • 拼接
      • StringBuilder源码分析
  • 集合
    • ArrayList
      • 成员方法
      • 包装类
  • static
    • 静态变量
    • 静态方法
      • 工具类
    • 注意事项
    • main方法
    • 注意事项
    • main方法

JAVA第二周学习笔记

IDEA

  1. 项目(Project)
    • 项目是一个完整的软件工程,通常包含了多个模块或子系统,用于实现一个特定的功能或解决一个特定的问题。
    • 项目可以包含多个模块,每个模块可以独立编译、打包和部署。
  2. 模块(Module)
    • 模块是项目中的一个独立单元,它负责实现一个特定的功能或提供一组相关的功能。
    • 模块可以包含多个包,通常是逻辑上相关的一组包,用于组织代码和资源。
  3. 包(Package)
    • 包是Java中用来组织类和接口的一种机制,它类似于文件系统中的文件夹。
    • 包用于对相关的类和接口进行分组,提供了命名空间管理和访问控制的功能。
    • 包名通常采用逆域名的命名规则,例如com.example.project
  4. 类(Class)
    • 类是Java中最基本的代码单元,用于描述对象的属性和行为。
    • 类定义了对象的结构和行为,包括属性(字段)和方法。
    • 类可以被实例化为对象,对象是类的具体实例,具有类定义的属性和行为。

层级关系:

project(工程) - module(模块) - package(包) - class(类)

具体的:

  1. 一个 project 中可以创建多个 module

  2. 一个 module 中可以创建多个 package

    包名要求:

    1.不要有中文

    2.不要以数字开头

    3.给包取名时一般都是公司域名倒着写,而且都是小写

    比如:尚硅谷网址是 www.atguigu.com

    那么 package 包名应该写成:com.atguigu.子名字。

  3. 一个 package 中可以创建多个 class

class类中不必包含 main 方法。在 Java 中,只有包含 main 方法的类才能作为程序的入口点,因为 JVM(Java 虚拟机)会在运行程序时自动调用 main 方法来执行程序的逻辑。但是,除了程序的入口点之外,其他类并不需要包含 main 方法。

方法

方法是程序中的最小执行单元,也称为函数或过程。它是一段可重复使用的代码块,用于执行特定的任务或操作。方法通常接受输入参数(也称为参数)并产生输出结果(也称为返回值)。

方法可以类比为C语言中的函数

格式

方法写在类里面,main的外面

public class MethodDemo1 {public static void main(String[] args) {playgame();}public static void playgame(){System.out.println("you");System.out.println("will");System.out.println("lose");}
}

带参数及返回值的方法

import java.util.Scanner;
public class MethodDemo1 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int a = sc.nextInt();int b = sc.nextInt();int c = GetSum(a, b);System.out.println(c);}public static int GetSum(int a, int b) {return a + b;}
}

方法的重载

方法的重载是指在同一个类中可以定义多个同名的方法,但它们的参数列表(参数类型、参数个数、参数顺序)必须不同。重载方法可以提高代码的灵活性和可读性,使得方法名可以更加直观地反映其功能。

Java中的方法重载必须满足以下规则:

  1. 方法名必须相同。
  2. 参数列表必须不同(参数类型、参数个数、参数顺序),可以有不同的类型和个数的参数,也可以有不同顺序的参数。
  3. 方法的返回类型可以相同也可以不同。
  4. 方法的返回值、方法的访问修饰符和方法抛出的异常无关。
  5. 在同一个类中。

方法的内存

栈(Stack)通常用于存储方法的调用和局部变量等,它的特点是后进先出(LIFO,Last In First Out)。

当一个方法被调用时,会在栈中分配一段内存,称为栈帧,用于存储方法的参数、局部变量以及方法调用的返回地址等信息。方法执行完成后,对应的栈帧会被销毁,释放出的内存可以被重用。

堆(Heap)则是用于动态分配内存的一种方式,通常用于存储对象和数据结构等。

在堆中分配的内存不会自动释放,需要手动进行管理。java通过关键字 new ,C通过 malloc在堆上分配的内存空间,直到显式释放或程序结束时才会被回收。


引用:使用了其他空间中的数据

数组是一种引用数据类型,意味着声明一个数组变量时,实际上是在栈内存中分配了一个引用(或者说指针),该引用指向堆内存中的实际数组对象。数组对象在堆内存中连续存储着多个元素。

例如,声明一个整型数组变量:

int[] arr;//存储的是地址值

这里的arr是一个引用类型的变量,它在栈内存中分配了空间,但是并没有在堆内存中分配实际的数组对象。需要通过new关键字来创建数组对象,例如:

arr = new int[3];

这行代码在堆内存中创建了一个长度为3的整型数组对象,并将该对象的引用赋给了arr变量。

1713794915312

二维数组

静态初始化

int[][] matrix = {{1, 2, 3},{4, 5, 6},{7, 8, 9}
};

动态初始化

dataType[][] arrayName = new dataType[rows][columns];
dataType[][] arrayName = [rows][columns];
  • 在 Java 中,二维数组是由一系列一维数组组成的,每个一维数组可以具有不同的长度。Java 的多维数组实际上是数组的数组,每个数组元素都是一个引用,指向另一个数组。

面向对象

类和对象

类:共同特征的描述。

对象:是真实存在的具体示例。

如何定义类

public class 类名 {1.成员变量2.成员方法3.构造器4.代码块5.内部类
}

如何得到对象

public class 类名 {1.成员变量(属性,名词)2.成员方法(行为,动词)
}
类名 对象名 = new 类名();

举例:

public class Phone {String brand;double price;public void call(){System.out.println("打电话");}public void play() {System.out.println("玩手机");}
}
public class PhoneTest {public static void main(String[] args) {Phone p = new Phone();p.brand = "mi";p.price = 1000;System.out.println(p.brand);System.out.println(p.price);p.call();p.play();}
}

注意

  1. javabean类:用于描述一类事物的类,在javabean类中,不写main方法

  2. 测试类:编写main方法的类,可以再测试类中创建javabean类,进行赋值调用

  3. 定义类名的规定:

    • 首字母以字母、下划线(_)或美元符号($)开头
    • 不能用关键字
    • 一个.java文件可以定义多个类
    • 一个.java文件中的多个类中只有一个类可以用public修饰,该类名需要与.java文件名一致
    • 建议一个文件里一个类
  4. 成员变量完整定义:

    修饰符 数据类型 变量名 = 初始值
    

    一般无需初始值

  5. 对象的成员变量默认值规则:

    moren

封装

在面向对象程式设计方法中,封装(Encapsulation)是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。

封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。

要访问该类的代码和数据,必须通过严格的接口控制。

对象代表什么,就得封装对应的数据,并提供数据对应的行为.对象代表现实世界中的实体或概念,封装对应着将对象的数据和行为组合在一起,形成一个独立的、可重用的单位。

封装的优点

  • 良好的封装能够减少耦合。
  • 类内部的结构可以自由修改。
  • 可以对成员变量进行更精确的控制。
  • 隐藏信息,实现细节。

private关键字

  • 是一个权限修饰符
  • 可以修饰成员(成员变量和成员方法)
  • 被private修饰的成员在本类中才能访问
  • 针对private修饰的成员变量,如果需要被其他类使用,提供相应的操作。
  1. 提供set###(参数)方法,用于给成员变量赋值,用public修饰
  2. 提供get###(参数)方法,用于获取成员变量的值,用public修饰
//GirlFriend.java
package com.feng;public class GrilFriend {private String name;private int age;public void setName(String n) {name = n;}public String getName() {return name;}public void setAge(int n) {if (n >= 0 && n <= 70) {age = n;} else {System.out.println("Invalid Age");}}public int getAge(){return age;}
}
//GirlFriendTest.java
package com.feng;public class GirlFriendTest {public static void main(String[] args) {GrilFriend gf1 = new GrilFriend();gf1.setName("甜甜");gf1.setAge(18);System.out.println(gf1.getName());System.out.println(gf1.getAge());GrilFriend gf2 = new GrilFriend();gf2.setName("香香");gf2.setAge(20);System.out.println(gf2.getName());System.out.println(gf2.getAge());}
}

成员变量和局部变量

成员变量:

  • 定义位置: 在类中,方法之外。
  • 作用域: 在整个类中可见,可以被类中的所有方法访问和操作。
  • 生命周期: 随着对象的创建而创建,随着对象的销毁而销毁。
  • 存储位置: 存储在堆内存中,每个对象都有自己的一份成员变量副本。
  • 初始化: 成员变量可以显式初始化,如果未显式初始化,则会根据数据类型自动赋予默认值。
  • 作用: 用于表示对象的状态或属性,通常用来描述对象的特征和属性。

局部变量:

  • 定义位置: 在方法、代码块或构造方法内部。
  • 作用域: 仅在声明它的方法、代码块或构造方法内部可见,出了声明的作用域就无法访问。
  • 生命周期: 随着方法、代码块或构造方法的执行而创建,随着执行结束而销毁。
  • 存储位置: 存储在栈内存中,存储的是变量的引用或值。
  • 初始化: 局部变量必须在声明时进行初始化,否则编译器会报错。
  • 作用: 用于临时存储数据或在方法中进行计算,通常用于方法内部的临时变量。

Screenshot_2024-04-24-20-39-43-696_tv.danmaku.bil

this关键字

是一个引用,指向当前对象的引用。this本质是方法调用者的地址值

this 关键字可以在类的方法中使用,用于引用当前对象的实例。

public class GrilFriend {private String name;private int age;public void method(){int age = 10;System.out.println(age);//10System.out.println(this.age);//0}
}

区分同名变量: 当对象的成员变量与方法的参数或局部变量同名时,使用 this 关键字可以明确指示成员变量。

public class MyClass {private int x;public void setX(int x) {this.x = x; // 使用this引用成员变量x,区分参数x}
}

构造方法

作用

创建对象时,由虚拟机自动调用,给成员变量进行初始化的

  1. 初始化对象的状态: 构造方法用于初始化对象的成员变量,确保对象在创建后处于一个合理的状态。
  2. 提供对象的初始化选项: 构造方法可以带有参数,允许在创建对象时传递参数来指定对象的初始状态。
  3. 创建对象: 在 Java 中,使用 new 关键字来创建对象时,会自动调用该对象的构造方法来初始化对象。

类型

public class Student {修饰符 类名(参数) {方法体;}
}

无参数和有参数构造:

public class MyClass {// 无参构造方法public MyClass() {}// 带参数的构造方法public MyClass(int x, int y) {}
}

特点

  1. 方法名与类名相同,大小写也要一致

  2. 没有返回值类型,连void都没有

  3. 没有具体的返回值(不能由return带回结果数据)

执行时机

  1. 创建对象的时候由虚拟机调用,不能手动调用构造方法
  2. 每创建一次对象,就会调用一次构造方法

定义

  • 如果没有定义构造方法,系统会给出一个默认的无参数构造方法
  • 如果定义了构造方法,系统不再提供默认的无参数构造方法

重载

在同一个类中定义多个构造方法,它们的方法名相同但参数列表不同。

可以提供不同的初始化选项,使得创建对象时可以根据不同的需求选择合适的构造方法进行初始化。

  • 一般空参构造有参构造都要编写,以应对不同场景。

  • 无论是否使用,都要手动书写无参数构造和带全部参数的构造。

标准javabean

  1. 类名见名知义
  2. 成员变量使用private修饰
  3. 至少提供两个构造方法
    • 无参构造方法
    • 带全部参数的构造方法
  4. 成员方法
    • 提供每一个成员变量对应的set###() get###()
    • 其他行为

快捷键:

  1. alt + insert/鼠标右键生成(generate):构造函数获得构造方法,getter and setter设置get和set成员方法
  2. 插件ptg:右键ptg to javabean一键生成

对象内存图

方法区(Method Area)是 Java 虚拟机(JVM)内存中的一个重要组成部分,用于存储类的元信息、静态变量、常量、编译器编译后的代码等数据。方法区在 JVM 规范中也被称为永久代(Permanent Generation),但在 JDK 8 及以后的版本中,永久代已被元空间(Metaspace)所取代。

Student s = new Student();
  1. 加载class文件

  2. 申明局部变量

  3. 在堆内存中开辟一个空间

  4. 默认初始化

  5. 显示初始化

  6. 构造方法初始化

  7. 将堆内存中的地址值赋值给左边的局部变量

    Screenshot_2024-04-24-20-15-29-009_tv.danmaku.bil

基本数据类型:数据存在自己空间

引用数据类型:数据村其他空间中,自己存储的是地址值

this本质是方法调用者的地址值

API

java API:指的就是JDK中提供的各种功能的java类

Java API帮助文档:Java编程语言的官方文档,提供了关于Java标准库中各个类、接口、方法的详细信息和使用说明。

Overview (Java SE 17 & JDK 17) (oracle.com)

字符串

创建Sting对象

  1. 直接赋值

    String name = "xuanxuan";
    
  2. new

    构造方法说明
    public String( )无参构造方法,创建一个空字符串对象
    public String(String original)创建一个与原始字符串内容相同的新字符串对象
    public String(char[ ] chs)创建一个包含字符数组内容的字符串对象
    public String(byte[ ] chs)创建一个使用指定字符集编码的字符串对象

    举例:

public class StringDemo {public static void main(String[] args) {String name1 = "xuan";System.out.println(name1);String name2 = new String();name2 = "xuan";System.out.println(name2);String name3 = new String("xuan");System.out.println(name3);char chs[]={'x','u','a','n'};String name4 = new String(chs);System.out.println(name4);byte bytes[]={97,98,99,100};String name5 = new String(bytes);System.out.println(name5);}
}

存储的内存原理

StringTable串池

String 类中的字符串池(String Pool)是一种特殊的存储区域,用于存储字符串常量。它位于堆内存中,并且被所有线程共享。字符串池的主要作用是提高字符串的重用性,避免在内存中重复创建相同内容的字符串,从而节省内存空间。

使用双引号直接创建字符串时,系统会检查该字符串在串池中是否存在:

  • 不存在:创建新的

  • 存在:复用

String s1 = "Hello"; // 创建一个字符串对象,放入字符串池中
String s2 = "Hello"; // 直接从字符串池中获取已存在的字符串对象
  • 通过 new 关键字创建的字符串对象不会放入字符串池中,而是在堆内存中创建一个新的字符串对象

    即使字符串池中已经存在字符串,系统也会在堆内存中创建一个新的字符串对象,而不会复用字符串池中的对象。

常用方法

字符串比较

==对于基本数据类型比较数据值,对于引用数据类型比较地址值

字符串内容比较:

  1. boolean equals:完全一样返回true
  2. boolean equalsIgnoreCase:忽略大小写

键盘输入的也是new出来的

字符串遍历

  1. public char charAt(int index):根据索引返回字符
  2. public int length():返回字符串长度

数组名.length

字符串对象.length()

字符串截取

  1. String substring(int beginIndex,int endIndex):返回值是截取的小串,包左不包
  2. String substring(int beginIndex):截取到

字符串替换

  1. String replace(旧值,新值):返回值是替换后结果

SpringBulider

当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。

和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。

StringBuilder可以看做一个容器(一个动态大小的字符数组)。

StringBuilder 允许修改字符串内容,而不会产生新的字符串对象,从而提高了字符串操作的效率。

构造方法

方法名说明
public StringBuilder()才能构建一个空白可变字符的对象,不含有任何内容
public StringBuilder(String str)根据字符串内容,来创建可变字符串对象
StringBuilder(int capacity)创建一个具有指定初始容量的StringBuilder对象。

常用方法

方法名说明
public StringBuilder append(任意类型)添加数据,返回对象本身
public StringBuilder reverse()翻转容器中的内容
public int length()返回长度
public Sting toString()通过该方法实现把StringBuilder转换为String

链式编程

链式编程是一种编程风格,它允许在同一个对象上通过多个方法的调用链实现一系列操作。

从而简化代码,提高可读性,和代码的可维护性。

这有一个反转字符串的示例,使用了链式编程

package com.feng;import java.util.Scanner;public class ReverseString {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String str = sc.next();StringBuilder sb = new StringBuilder();String ret = sb.append(str).reverse().toString();System.out.println(ret);}
}

StringJoiner

使用 StringJoiner 可以指定分隔符,并向其中添加多个字符串,最后得到一个拼接好的字符串。它的构造方法可以接受分隔符、前缀和后缀作为参数,用于指定拼接的格式。

构造方法

方法名说明
StringJoiner(分隔符号)创建一个StringJoiner对象,使用指定间隔符号
StringJoiner(分隔符号,开始符号,结束符号)创建一个StringJoiner对象,使用指定间隔符号,开始符号,结束符号

成员方法

方法名说明
public StringJoiner add(添加内容)添加数据,返回对象本身
public int length()返回长度
public String toString()获取拼接器中的字符串表示,包括前缀、元素和后缀

字符串原理

拼接

如果没有变量参与,都是字符串直接相加,编译之后就是拼接之后的结果,会复用串池中的字符串。

如果有变量

JDK8以前:系统底层会自动创建一个StringBuilder对象,然后再调用其append方法完成拼接。
拼接后,再调用其toString方法转换为String类型,而toString方法的底层是直接new了一个字符串对象
JDK8版本:系统会预估要字符串拼接之后的总大小,把要拼接的内容都放在数组中,此时也是产生一个新的字符串。

StringBuilder源码分析

  • 默认创建一个长度为16的字节数组

  • 添加的内容长度小于16,直接存

    添加的内容大于16会扩容(原来的容量 * 2 + 2)

  • 如果扩容之后还不够,以实际长度为准

有效地减少频繁扩容带来的性能开销,并且在大部分情况下能够保证足够的容量来存储字符串内容

集合

集合长度可变

只能存引用数据类型,基本数据类型(包装类)

ArrayList

ArrayList 类位于 java.util 包中,使用前需要引入

import java.util.ArrayList;ArrayList<E> objectName =new ArrayList<>();
  • E: 泛型数据类型,用于设置 objectName 的数据类型,只能为引用数据类型
  • objectName: 对象名。

成员方法

方法名说明
boolean add(E e)添加元素,返回值表示是否添加成功
boolean remove(E e)删除指定元素,返回值表示是否删除成功
E remove(int index)删除指定索引的元素,返回被删除元素
E set(int index,E e)修改指定索引下的元素,返回原来的元素
E get(int index)获取指定索引的元素
int size()集合的长度,也就是集合中元素的个数
import java.util.ArrayList;
public class ArrayListDemo1 {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("aaa");list.add("bbb");list.add("ccc");System.out.print("[");for (int i = 0; i < list.size(); i++) {if (i != list.size() - 1)System.out.print(list.get(i) + ",");elseSystem.out.print(list.get(i));}System.out.println("]");}
}

包装类

只能为引用数据类型,想使用基本类型使用到基本类型的包装类。

基本类型引用类型
booleanBoolean
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
ArrayList<Integer> intList = new ArrayList<>();

使用 ArrayList 存储自定义的对象:

//Student.java
public class Student {private String name;private int age;
...
}
//ArrayListDemo.java
import java.util.ArrayList;public class ArrayListDemo2 {public static void main(String[] args) {ArrayList<Student> list = new ArrayList<>();Student s1 = new Student("张三", 10);Student s2 = new Student("李四", 12);Student s3 = new Student("王五", 14);list.add(s1);list.add(s2);list.add(s3);for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i).getName() + "," + list.get(i).getAge());}}
}

static

static 关键字用于创建类级别的成员,这意味着它们属于类本身,而不是类的实例。这些静态成员在整个程序运行期间只有一份副本,并且可以通过类名直接访问,而不需要创建类的实例。

静态变量

被static修饰的成员变量

public class Student {private String name;private int age;public static String teacherName;// 静态变量
}

特点:

  • 被该类所有对象共享
  • 不属于对象,属于类
  • 静态变量是随着类的加载而加载的,优先于对象的出现

调用方式:

  1. 类名调用

    //类名调用
    Student.teacherName =  "lihua";
    
  2. 对象名调用

    Student st = new Student();
    //对象名调用
    st.teacherName = "lihua";
    

静态方法

静态方法是属于类而不是对象的方法。这意味着你可以直接通过类名调用静态方法,而不需要先创建类的实例。

特点:

  • 多用在测试类和工具类中
  • javabean类中很少会用

调用方式:

  1. 类名调用

  2. 对象名调用

工具类

  • javabean类:用来描述一类事物的类
  • 测试类:用来检查其他类的正确性,带main方法的类,程序的入口。通过创建对象并调用其方法来测试目标类的功能。
  • 工具类:不是用来描述一类事物,而是为了提供一些通用的方法或功能。

工具类不需要实例化,因为它们提供的方法都是静态的,可以直接通过类名调用。

JavaBean类的方法是实例方法,必须通过对象引用来调用,而不能直接使用类名。

import java.util.List;public class StudentUtil {private StudentUtil(){// 私有构造方法,意味着它不能被实例化,也就是说无法使用new关键字创建StudentUtil类的对象。// 这样做是为了确保StudentUtil类中的方法都是静态的,可以直接通过类名调用,而不需要创建对象。}// 计算学生平均分的静态方法// 用static修饰public static double calculateAverage(List<Student> students) {double total = 0;for (Student student : students) {total += student.getScore();}return total / students.size();}
}
//在测试类中直接用类名调用		
double average = StudentUtil.calculateAverage(students);
System.out.println("Average score: " + average);
  1. 作用
    • 提供常用功能的封装:如字符串处理、日期时间操作、文件操作等。
    • 提高代码复用性和可维护性:将常用功能封装在工具类中,可以在多个地方重复使用,同时也方便统一维护和修改。
  2. 设计原则
    • 单一职责原则(SRP):每个工具类应该只负责一个功能领域,保持类的简洁和易于理解。
    • 静态方法:通常工具类中的方法都是静态的,方便直接调用,无需实例化类对象。
    • 私有化构造方法:通过将构造方法私有化,可以防止工具类被实例化,确保工具类中的方法都是静态的,可以直接通过类名调用。

注意事项

  1. 静态方法只能访问静态成员(静态变量和静态方法),无法直接访问类的非静态成员(实例变量和实例方法)。
  2. 非静态方法可以访问所有:静态变量或者静态方法,非静态的成员变量和非静态的成员方法。
  3. 不能使用this关键字:由于静态方法属于类而不是对象,因此不能在静态方法中使用this关键字来引用当前对象。
  • 静态随着类的加载而加载
  • 非静态跟对象有关

main方法

main方法是Java程序的入口点,它是Java程序的起始点,所有的Java应用程序都必须包含一个main方法。

当你运行一个Java程序时,Java虚拟机会首先加载并执行main方法。

public class Main {public static void main(String[] args) {System.out.println("Hello, world!");}
}
  • public表示main方法是公有的,可以被外部调用。
  • static表示main方法是静态的,可以直接通过类名调用,无需实例化类对象。
  • void表示main方法没有返回值。
  • String[] args是一个字符串数组参数,用于接收命令行参数。

可以向String[] args中传递参数,在 Program arguments输入框中输入传递的参数,参数之间用空格分隔,表示不同的字符串。现在很少使用。
将常用功能封装在工具类中,可以在多个地方重复使用,同时也方便统一维护和修改。
2. 设计原则

  • 单一职责原则(SRP):每个工具类应该只负责一个功能领域,保持类的简洁和易于理解。
  • 静态方法:通常工具类中的方法都是静态的,方便直接调用,无需实例化类对象。
  • 私有化构造方法:通过将构造方法私有化,可以防止工具类被实例化,确保工具类中的方法都是静态的,可以直接通过类名调用。

注意事项

  1. 静态方法只能访问静态成员(静态变量和静态方法),无法直接访问类的非静态成员(实例变量和实例方法)。
  2. 非静态方法可以访问所有:静态变量或者静态方法,非静态的成员变量和非静态的成员方法。
  3. 不能使用this关键字:由于静态方法属于类而不是对象,因此不能在静态方法中使用this关键字来引用当前对象。
  • 静态随着类的加载而加载
  • 非静态跟对象有关

main方法

main方法是Java程序的入口点,它是Java程序的起始点,所有的Java应用程序都必须包含一个main方法。

当你运行一个Java程序时,Java虚拟机会首先加载并执行main方法。

public class Main {public static void main(String[] args) {System.out.println("Hello, world!");}
}
  • public表示main方法是公有的,可以被外部调用。
  • static表示main方法是静态的,可以直接通过类名调用,无需实例化类对象。
  • void表示main方法没有返回值。
  • String[] args是一个字符串数组参数,用于接收命令行参数。

可以向String[] args中传递参数,在 Program arguments输入框中输入传递的参数,参数之间用空格分隔,表示不同的字符串。现在很少使用。


如有错误烦请指正。
感谢您的阅读

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/5735.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

neo4j 的插入速度为什么越来越慢,可能是使用了过多图谱查询操作

文章目录 背景描述分析解决代码参考neo4j 工具类Neo4jDriver知识图谱构建效果GuihuaNeo4jClass 背景描述 使用 tqdm 显示&#xff0c;处理的速度&#xff1b; 笔者使用 py2neo库&#xff0c;调用 neo4j 的API 完成节点插入&#xff1b; 有80万条数据需要插入到neo4j图数据中&am…

FANUC机器人SOCKET断开KAREL程序编写

一、添加一个.KL文件创建编辑断开指令 添加一个KL文件用来创建karel程序中socket断开指令 二、断开连接程序karel代码 PROGRAM SOC_DIS %COMMENT SOCKET断开 %INCLUDE klevccdf VAR str_input,str_val : STRING[20] status,data_type,int_val : INTEGER rel_val : REALBEGING…

【氮化镓】GaN器件在航天器高可靠正向转换器中应用

文章是发表在《IEEE Journal of Emerging and Selected Topics in Power Electronics》2022年10月第10卷第5期上的一篇关于GaN(氮化镓)器件在航天器高可靠性正向转换器中应用的研究。文章的作者是匹兹堡大学电气与计算机工程系的Aidan Phillips, Thomas Cook和Brandon M. Gra…

Android AOSP探索之Ubantu下Toolbox的安装

文章目录 概述安装Toolbox解决运行的问题 概述 由于最近需要进军android的framework,所以需要工具的支持&#xff0c;之前听说江湖上都流传source insight,我去弄了一个破解版&#xff0c;功能确实强大&#xff0c;但是作为多年android开发的我习惯使用android studio。虽然使…

linux 光驱(光盘)安装

文章目录 自带 YUM 库创建 repo创建文件夹挂载光驱开机自启动挂载安装软件YUM 安装RPM 安装 自带 YUM 库 ls /etc/yum.repos.d创建 repo vim /etc/yum.repo.d/demo.repo // 编写 repo 相关配置 [demo] namedemo baseurlfile:///mnt/cdrom gpkcheck0创建文件夹挂载光驱 /dev/…

【沉淀之华】从0到1实现用户推荐 - 实时特征系统构建,包含特征计算,特征存储,特征查询,特征补偿超详细思路分享

文章目录 背景介绍设计初衷基本概念 技术架构"四高"特征存储特征计算特征查询特征补偿 技术难点Q&A彩蛋 背景介绍 设计初衷 作为用户推荐系统的支撑系统之一&#xff1a;用户实时特征系统有着举足轻重的重要&#xff0c;甚至说它是一起推荐行为触发的必要条件。…

c#word文档:3.向Word文档中插入表格/4.读取Word文档中表格

--向Word文档中插入表格-- &#xff08;1&#xff09;在OfficeOperator项目的WordOperator类中定义向Word文档插入换页的函数NewPage &#xff08;2&#xff09;在WordOperator类中定义向Word文档插入表格的函数InsertTable using Microsoft.Office.Interop.Word;// 引入Mic…

探索APP内测分发的全过程(APP开发)

什么是APP内测分发探索APP内测分发的全过程&#xff1f; APP内测分发是在应用程序开发过程中探索APP内测分发的全过程&#xff0c;开发者将应用程序的测试版或预发布版分发给特定用户进行测试、反馈和评估的一种方式。这是一个非常重要的环节&#xff0c;可以有效地提高应用的…

详解SDRAM基本原理以及FPGA实现读写控制

文章目录 一、SDRAM简介二、SDRAM存取结构以及原理2.1 BANK以及存储单元结构2.2 功能框图2.3 SDRAM速度等级以及容量计算 三、SDRAM操作命令3.1 禁止命令&#xff1a; 4b1xxx3.2 空操作命令&#xff1a;4b01113.3 激活命令&#xff1a;4b00113.4 读命令&#xff1a;4b01013.5 写…

mac如何打开exe文件?如何mac运行exe文件 如何在Mac上打开/修复/恢复DMG文件

在macOS系统中&#xff0c;无法直接运行Windows系统中的.exe文件&#xff0c;因为macOS和Windows使用的是不同的操作系统。然而&#xff0c;有时我们仍然需要运行.exe文件&#xff0c;比如某些软件只有Windows版本&#xff0c;或者我们需要在macOS系统中运行Windows程序。 虽然…

如何安全的使用密码登录账号(在不知道密码的情况下)

首先&#xff0c;需要用到的这个工具&#xff1a; 度娘网盘 提取码&#xff1a;qwu2 蓝奏云 提取码&#xff1a;2r1z 1、打开工具&#xff0c;进入账号密码模块&#xff0c;如图 2、看到鼠标移动到密码那一栏有提示&#xff0c;按住Ctrl或者Alt点击或者双击就能复制内容&…

正版Office-Word使用时却提示无网络连接请检查你的网络设置 然后重试

这是购买电脑时自带的已经安装好的word。看纸箱外壳有office标记&#xff0c;但是好像没有印系列号。 某天要使用。提示&#xff1a;无网络连接请检查你的网络设置。 经过网上高手的提示&#xff1a; 说要勾选勾选ssl3.0、TLS1.0、1.1、1.2。 我的截图 我电脑进去就缺1.2. …

PCIe总线-MPS MRRS RCB参数介绍(四)

1.概述 PCIe总线的存储器写请求、存储器读完成等TLP中含有数据负载&#xff0c;即Data Payload。Data Payload的长度和MPS&#xff08;Max Payload Size&#xff09;、MRRS&#xff08;Max Read Request Size&#xff09;和RCB&#xff08;Read Completion Boundary&#xff0…

C++ 抽象机制

抽象机制 1. 虚函数 使用关键字virtual 声明的函数&#xff0c;意思是可能随后在其派生类中重新定义。 纯虚函数 在声明的末尾使用0 的函数&#xff0c;说明是纯虚函数。 抽象类 含有纯虚函数多的类称为抽象类(abstract class). 多态类型 如果一个类负责为其他一些类提供接…

unity入门——按钮点击了却无法调用函数

查阅了一番都没有解决问题&#xff0c;最后发现问题是由button的Onclick()事件绑定了代码脚本而不是游戏对象导致的。 如果Onclick()事件绑定的是代码脚本&#xff0c;则下拉框里没有函数&#xff0c;但是点击MonoScript后能手动填入函数名&#xff08;本以为这样就能实现调用…

State.initState() must be a void method without an `async` keyword错误解析

文章目录 报错问题报错的代码 错误原因解决方法解析 另外的方法 报错问题 State.initState() must be a void method without an async keyword如下图&#xff1a; 报错的代码 报错的代码如下&#xff1a; overridevoid initState() async{super.initState();await getConf…

openssl3.2 - exp - 使用默认的函数宏,在release版中也会引入__FILE__

文章目录 openssl3.2 - exp - 使用默认的函数宏&#xff0c;在release版中也会引入__FILE__概述笔记验证是否__FILE__在release版下也能用&#xff1f;将openssl编译成release版的&#xff0c;看看CRYPTO_free()是否只需要一个参数就行&#xff1f;将工程中的openssl相关的库换…

重定义大语言模型的记忆能力:对抗性压缩如何挑战现有测量法

DeepVisionary 每日深度学习前沿科技推送&顶会论文分享&#xff0c;与你一起了解前沿深度学习信息&#xff01; Rethinking LLM Memorization through the Lens of Adversarial Compression 引言&#xff1a;探索大型语言模型的记忆能力 在当今信息时代&#xff0c;大型…

Window(Qt/Vs)软件添加版本信息

Window&#xff08;Qt/Vs&#xff09;软件添加版本信息 文章目录 Window&#xff08;Qt/Vs&#xff09;软件添加版本信息VS添加版本信息添加资源文件添加版本定义头自动更新版本添加批处理脚本设置生成事件 Qt添加版本信息添加资源文件文件信息修改自动更新版本 CMake添加版本信…

#ESP32S3R8N8建立工程(VSCODE)点亮LED

1.参考文档 【立创ESP32S3R8N8】IDF入门手册 - 飞书云文档 (feishu.cn)https://lceda001.feishu.cn/wiki/GOIlwwfbIi1SC3k8594cDeFVn8g 2.建立工程 3.运行效果 4.更改配置 5.插播 之前配置的环境是有问题的&#xff0c;就算有自动检测也要仔细检查&#xff0c;必须严格按照以…