【发布时间】:2019-09-03 04:01:31
【问题描述】:
Java 在与该类交互时初始化外部类静态字段,但不初始化嵌套的静态类字段。
所以我已经阅读了嵌套类文档:https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html,我认为它归结为这一行:
实际上,静态嵌套类在行为上是一个顶级类,为了方便打包,它已经嵌套在另一个顶级类中。
如果我的理解是正确的,这意味着 java 将我下面的两个类视为单独的实体;
public class OutterClass {
private static final OutterClass outterField = new OutterClass("outterField");
private OutterClass(String string) {
System.out.println(string + " has been initialised");
}
private static class InnerClass {
private static final OutterClass innerField = new OutterClass("innerField");
}
public static void foo() {}
}
这意味着当我通过调用Outer.foo() 与OuterClass 交互时,java 将初始化我的静态字段,因为它是OuterClass 的一部分。但由于它将InnerClass 视为一个单独的顶级类,InnerClass 的字段不会被初始化。
1) 我的理解正确吗?
2) 这与 JIT 编译器或类加载器有什么关系吗?加载OuterClass 时是否加载了InnerClass?
谢谢
【问题讨论】:
-
1) 是(编译内部类并创建一个单独的类文件,最终使用一些合成方法来创建一个不同的类,以允许从外部类访问私有成员); 2) no 或 no,no(对于 VM,它只是一个普通的 separate 类 - 编译器完成了所有 magic)
-
您能否将此添加为答案,以便我接受。我检查了我的类文件,你是对的,它确实为
InnerClass和OuterClass构建了两个单独的类文件。现在更有意义的是为什么InnerClass.innerField没有初始化,因为它在物理上位于单独的文件中。
标签: java static initialization