我正在研究JAVA初始化过程。 这是一个很好的参考资料: When a class is loaded and initialized in JVM
在此页面上有规则说: 3)如果由于访问静态字段而触发了类初始化,则只有已声明静态字段的Class才会被初始化,并且即使静态字段被子类的类型引用,它也不会触发超类或子类的初始化,Sub Interface或接口的实现类。
我真的不明白这个主意。如果静态字段由Sub类引用,则该字段当然需要创建子类对象或由Sub类对象分配。 因此,它肯定会触发Sub类初始化。
我的解释有什么问题?
修改:
答案 0 :(得分:2)
我认为重点是在这样的情况下:
public class Superclass {
public static long INIT_TIME = System.currentTimeMillis();
static {
System.out.println("Initializing Superclass");
}
}
public class Subclass extends Superclass {
static {
System.out.println("Initializing Subclass");
}
}
此代码:
long time = Subclass.INIT_TIME;
实际编译为:
long time = Superclass.INIT_TIME;
即使源代码引用Subclass
,也会打印和 “初始化超类”。
答案 1 :(得分:0)
一个例子:
class A {
public static int nA = 0;
}
class B extends A {
public static int nB = 1;
}
class C extends B {
public static int nC = 2;
}
客户端:
int test = B.nA;
JVM将仅初始化A类。不是B也不是C.
答案 2 :(得分:0)
如上所示,当我运行Superclass / Subclass示例时,在调用Subclass.INIT_TIME时, 调用Superclass和Subclass静态初始值设定项。
但据说只会打印“初始化超类”。 有人可以澄清吗?