子类将在对象的第一次调用中加载。那么为什么
class Super { static String ID = "SUPER_ID"; }
class SubClass extends Super{
static { System.out.print("In SubClass"); }
}
class Test{
public static void main(String[] args) {
System.out.println(SubClass.ID);
}
}
为什么我在输出中
SUPER_ID
而不是
In SubClass
SUPER_ID
子类将在对象的第一次调用中加载。那么为什么
static
初始化块不执行呢?谢谢。
因为在编译时本身,编译器会将 SubClass.ID 更改为 Super.ID。就像@Kugathasan阿比马兰所说,继承和静态是两回事。
例:
public class SampleClass {
public static void main(String[] args) {
System.out.println(SubClass.ID);
System.out.println(SubClass.i);
}
}
class Super {
static String ID = "SUPER_ID";
}
class SubClass extends Super {
static {
System.out.println("In SubClass");
}
static int i;
}
Output :
SUPER_ID
In SubClass // only when accessing a variable of subclass, the class will be initialized.
0
类加载器未加载您的类,因为它未在测试类中使用, 如果要加载它,只需在测试类中添加语句Class.forName("SubClass");
,之后您就可以看到预期的结果。 您也可以使用类加载器而不是Class.forName
加载此类。
class Test{
public static void main(String[] args) {
Class.forName("SubClass");
//Thread.currentThread().getContextClassLoader().loadClass("SubClass");
System.out.println(SubClass.ID);
}
}
根据Java语言规范:
对静态字段的引用仅导致类或 实际声明它的接口,即使它可能通过 子类、子接口或实现接口的类的名称。
更多信息