运行代码,输出的结果是(A)
public class P {
public static int abc = 123;
static{
System.out.println("P is init");
}
}
public class S extends P {
static{
System.out.println("S is init");
}
}
public class Test {
public static void main(String[] args) {
System.out.println(S.abc);
}
}
A、P is init<br />123
B、S is init<br />P is init<br />123
C、P is init<br />S is init<br />123
D、S is init<br />123
属于被动引用不会出发子类初始化
1.子类引用父类的静态字段,只会触发子类的加载、父类的初始化,不会导致子类初始化
2.通过数组定义来引用类,不会触发此类的初始化
3.常量在编译阶段会进行常量优化,将常量存入调用类的常量池中, 本质上并没有直接引用到定义常量的类,因此不会触发定义常量的类的初始化。
参考:《深入理解Java虚拟机》
这里有类主动引用和被动引用的demo:https://www.jianshu.com/p/3afa5d24bf71