当我初始化静态内部类时,我期望外部类也被初始化并将打印I should see this as well.
但是这不会发生,我只得到class Main
作为输出
class AA {
static {
System.out.println("I should see this as well.");
}
public static class BB {
BB() {
Object o = Main.class;
System.out.println(o.toString());
}
};
}
public class Test {
public static void main(String[] args) {
new AA.BB();
}
}
有人能帮助我,解释这种行为。
答案 0 :(得分:3)
嵌套类创建一个独特的类。
这里有两个类:
AA.class
AA $ BB.class
使用第二个不需要加载第一个,因为第二个是公共静态类。
答案 1 :(得分:2)
事情是:静态初始化程序块被懒惰地执行。含义:此代码在第一次真正“需要”AA类时执行。但AA不需要实例化AA $ BB。
如果你改变了
BB() {
Object o = Main.class;
System.out.println(o.toString());
}
到确实需要加载AA类:
BB() {
Object o = Main.class;
System.out.println(o.toString());
new AA();
}
然后也打印出其他字符串。
请注意:只有在您的来源代码中,BB才是“内部”AA。从类加载器的角度来看,AA和BB是(某种程度上)来自两个不同类文件的两个独立类!
编辑,给出“怎么看”的问题:
A)我用Test.class替换了Main.class并进行了编译,然后在我的文件系统AA$BB.class AA.class Test.class
中找到。
B)现在您可以运行[javap][1] -c "AA$BB.class"
以查看有关该类内容的更多信息