先看代码
// 父类
public class SuperClass {
static {
System.out.println("SuperClass Init!");
}
public static int value = 123;
}
//子类
public class SubClass extends SuperClass{
static {
System.out.println("SubClass init!");
}
}
测试
public class NotInitialization {
public static void main(String[] args){
// 对于静态字段,只有直接定义了这个字段的类才会被初始化
System.out.println(SubClass.value);
}
}
输出
SuperClass Init!
123
从输出结果中可以得出通过子类来引用父类中定义的静态字段,只会触发父类的初始化而不会触发子类的初始化。
但是触发了子类的加载。通过-XX:+TraceClassLoading参数可以观察。结果如下图: