【发布时间】:2014-08-01 23:14:46
【问题描述】:
这里是代码
public class ClassResolution {
static class Parent {
public static String name;
static {
System.out.println("this is Parent");
name = "Parent";
}
}
static class Child extends Parent {
static {
System.out.println("this is Child");
name = "Child";
}
}
public static void main(String[] args) throws ClassNotFoundException {
System.out.println(Child.name);
}}
我期望的输出是:
this is Parent
this is Child
Child
但实际上是:
this is Parent
Parent
似乎 Child 类中的静态块没有被执行,但为什么呢?这是反直觉的,不是吗?
补充:
为了更清楚,我在下面列出了 2 1 点:
- 正如@axtavt 所说,根据JLS 12.4.1,Child 类已加载,但未初始化。
但是@Alexei Kaigorodov 指出,根据jvms-5.5, 类 Child 应该被初始化,因为执行 在 Child 类上指令 getstatic。
你怎么看?
补充2:
@Alexei Kaigorodov 已经更新了他的想法,所以似乎没有分歧。但我认为 Alexei Kaigorodov 的观点很有启发性,所以我把它留在那里。
谢谢大家。
【问题讨论】:
-
我编辑了答案,不需要初始化 Child 类(尽管可能会发生)。
标签: java static-block