实例化静态嵌套类

时间:2015-12-20 14:30:54

标签: java inner-classes nested-class

本课

public class Main {

    public static void main(String[] args) {
        Main m = new Main();
        m.new A();
        m.new B();    //1 - compilation error

        new Main.B();
    }

    class A{}
    static class B{}  //2
}

将导致第1行的编译时错误:

Illegal enclosing instance specification for type Main.B

但是我无法理解为什么,我发现它有点违反直觉:在第2行我们有一个静态类定义,不应该也可以从对象m访问吗?

修改

如果Main有静态变量im.i不会导致编译错误。为什么行为与类定义不同?

2 个答案:

答案 0 :(得分:2)

没有

静态内部类的重点是具有封闭类的实例。

答案 1 :(得分:1)

m.new B();是实例化嵌套静态类的不正确方式,因为B不是Main类的实例变量 - 所以不需要Main的实例来创建它。相反,你可以做到

new Main.B();

为了清晰起见,从docs引用

  

静态嵌套类与其外部类(和其他类)的实例成员交互,就像任何其他顶级类一样。实际上,静态嵌套类在行为上是一个顶级类,它已嵌套在另一个顶级类中以方便打包。