静态嵌套类不初始化外部类

时间:2017-05-05 09:07:07

标签: java inner-classes

当我初始化静态内部类时,我期望外部类也被初始化并将打印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();
    }
}

有人能帮助我,解释这种行为。

2 个答案:

答案 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"以查看有关该类内容的更多信息