我正在研究JAVA初始化过程。这里有一个很好的参考材料:在JVM中加载和初始化类时
在本页面中有这样一条规则: 3)如果由于访问静态字段而触发类初始化,则只初始化声明了静态字段的类,即使静态字段被类型子类、子类接口或接口的实现类引用,也不会触发超类或子类的初始化。
我真的不明白这个主意。如果静态字段是由Sub类引用的,那么这个字段当然需要创建子类对象或由sub类对象分配。因此,它肯定会触发子类初始化。
我的解释怎么了?
编辑
发布于 2013-04-30 16:34:21
我想重点是在这样的情况下:
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。
发布于 2013-04-30 16:34:31
举个例子:
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类。
发布于 2014-11-02 14:54:15
如上面所示,当我运行超类/子类示例时,在调用Subclass.INIT_TIME时,将调用超类和子类静态初始化器。
但是这里说只有“初始化超类”才会被打印出来。有人能澄清吗?
https://stackoverflow.com/questions/16304733
复制相似问题