类的初始化是Java虚拟机在加载类和创建类的实例对象或调用类的静态方法时,对类进行准备工作的过程。
它主要包括:
- 给静态变量赋初始值。
- 执行静态代码块。
- 创建类的父类与成员。
类的初始化触发时机有:
- 创建类的实例:new一个类的对象时。
- 访问类的静态变量或静态方法:第一次读取或设置静态字段的运算符,或调用静态方法时。
- 使用反射方式强制创建某个类或接口对应的java.lang.Class对象时。
- 初始化一个类时,其父类和成员会先初始化。
- 只初始化一次:一个类的()方法只会被执行一次。
类的初始化遵循以下规则:
- 父类的()先执行。
- 成员变量和成员方法按定义顺序执行。
- 父类构造器会在子类构造器执行之前调用。
来看一个简单例子:
public class InitializationDemo {
static {
System.out.println("主类初始化");
}
public static void main(String[] args) {
Son s = new Son();
}
}
class Father {
static {
System.out.println("父类初始化");
}
}
class Son extends Father {
static {
System.out.println("子类初始化");
}
public Son() {
System.out.println("构造方法");
}
}
该程序执行main方法时,会按以下顺序初始化各个类:
- 父类Father初始化,输出”父类初始化”。
- 子类Son初始化,输出”子类初始化”。
- 主类InitializationDemo初始化,输出”主类初始化”。
- 创建Son的实例,输出”构造方法”。