

一、static
(一)static 成员
被 static 修饰的成员称为静态成员,也叫类成员。它不属于某个具体的对象,而是被该类的所有对象共享,且在方法区中只有一份。
(二)static 修饰成员变量
- 静态成员变量是类的属性,不属于某个特定对象,所有对象都共享这一份静态成员变量。
- 访问方式:既可以通过对象(
对象名.静态成员变量)访问,也可以通过类名(类名.静态成员变量)访问,推荐使用类名访问,更能体现其类成员的特性。 - 生命周期:与类的生命周期一致,从类加载开始,到类卸载结束。
(三)static 修饰成员方法
- 静态成员方法也叫类方法,属于类而不是某个对象。
- 调用方式:可以通过类名(
类名.静态方法名(参数))调用,也可以通过对象调用,但更推荐类名调用。 - 限制:
- 静态方法中不能直接访问非静态成员变量,因为非静态成员变量属于对象,而静态方法不依赖于对象。
- 静态方法不能直接调用非静态方法,因为非静态方法隐含
this参数(代表当前对象),静态方法调用时无法传递this引用。 - 静态方法不能被重写,因此也不能用来实现多态(多态依赖于方法重写,而静态方法是类级别的,子类的静态方法与父类的静态方法是隐藏关系,并非重写)。
(四)static 成员变量初始化
- 就地初始化:在定义静态成员变量时直接赋予初始值,如
static int num = 10;。 - 构造方法初始化:一般不推荐,因为构造方法是创建对象时调用的,而静态成员变量属于类,类加载时就已存在,若在构造方法中给静态成员变量赋值,每次创建对象都会执行,不符合静态成员共享的特性。
- 通过
get/set方法初始化:在需要的时候,调用类的get或set方法来设置静态成员变量的值。 - 代码块初始化:静态代码块在类加载时执行,适合用来初始化静态成员变量,例如:
class MyClass {
static int num;
static {
num = 20;
}
}
(五)补充知识点
- 静态成员属于类,不依赖于对象,所以访问静态成员时不需要创建对象,也不需要对象的引用。
- 静态方法中不能使用
this关键字,因为this代表当前对象的引用,而静态方法与对象无关。 - 非静态方法中可以直接调用静态方法,因为静态方法属于类,可直接通过类访问。
- 在静态方法中,若要使用非静态成员变量或方法,必须先创建对象,然后通过对象引用进行调用。
二、代码块
(一)普通代码块
定义在方法内部的代码块,用 {} 直接包裹代码。其中声明的变量作用域仅限于该代码块内部,出了代码块就无法访问。例如:
public void test() {
{
int num = 10;
System.out.println(num); // 输出 10
}
// System.out.println(num); // 编译报错,num 超出作用域
}
(二)构造代码块
又称实例代码块,定义在类内部,没有任何修饰符的 {} 代码块。它会在每次创建对象时执行,且执行时机在构造方法之前,主要用于初始化实例成员变量。例如:
class Person {
String name;
int age;
// 构造代码块
{
name = "默认名称";
age = 18;
}
public Person() {
System.out.println("构造方法执行");
}
}
// 创建对象时,先执行构造代码块初始化 name 和 age,再执行构造方法
Person p = new Person();
(三)静态代码块
用 static 修饰的代码块,定义在类内部、方法外部。它主要用于初始化静态成员变量,因为静态成员变量是类的属性,在 JVM 加载类时就会开辟空间并进行初始化。
- 当类被加载时,静态代码块会被执行;如果有多个静态代码块,会按照定义的顺序依次执行。
- 类只会被加载一次,所以静态代码块也只会被执行一次。例如:
class MyClass {
static int num;
static {
num = 10;
System.out.println("静态代码块1执行");
}
static {
System.out.println("静态代码块2执行,num = " + num);
}
}
// 类加载时,静态代码块1先执行,然后静态代码块2执行
(四)同步代码块
同步代码块是为了解决多线程环境下的线程安全问题,使用 synchronized 关键字来修饰,格式为 synchronized(锁对象) { // 同步执行的代码 }。通过锁机制,保证同一时刻只有一个线程能执行同步代码块内的内容。例如:
public class SyncDemo {
private Object lock = new Object();
public void method() {
synchronized (lock) {
// 同步执行的代码,避免线程安全问题
}
}
}
(五)执行顺序
在类的加载和对象创建过程中,代码块的执行顺序为:静态代码块 → 构造代码块 → 构造方法。即类加载时先执行静态代码块,之后每次创建对象时,先执行构造代码块,再执行构造方法。
2万+



被折叠的 条评论
为什么被折叠?



