Java 静态代码块与构造代码块
静态代码块
在 Java 中使用 static 关键字声明的代码块。静态块用于初始化类,为类的属性初始化。
静态代码块优先于非静态代码块执行,因为被 static 修饰的成员是类成员,随 JVM 加载类时执行;而实例成员需创建对象才会加载到堆内存。
每个静态代码块只执行一次。若类中包含多个静态代码块,则按照'先定义的代码先执行,后定义的代码后执行'的顺序。
public class Demo2 {
String name;
{ System.out.println("hello"); }
static { System.out.println("静态"); }
public Demo2(String name) { this.name = name; }
public static void main(String[] args) { new Child("cj"); }
}
class Child extends Demo2 {
static { System.out.println("子类静态"); }
{ System.out.println("子类构造"); }
public Child(String name) { super(name); }
}
对象初始化顺序
- 执行父类静态内容。
- 执行子类静态内容。
- 执行父类非静态代码块。
- 执行父类构造方法。
- 执行子类非静态代码块。
- 执行子类构造方法。
总结:静态代码块先执行,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。
构造代码块
构造代码块语法如下:
{
// 构造代码块
}
构造代码块的作用是给对象进行初始化。对象一建立就运行构造代码块,且优先于构造函数执行。类不能调用构造代码块,只有对象建立时才会运行。
构造代码块与构造函数的区别:
- 构造代码块:给所有对象进行统一初始化,定义的是不同对象共性的初始化内容。
- 构造函数:给对应的对象初始化,可以有多个,运行哪个构造函数就会建立什么样的对象。无论建立哪个对象,都会先执行相同的构造代码块。

