本课
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
有静态变量i
,m.i
不会导致编译错误。为什么行为与类定义不同?
答案 0 :(得分:2)
没有
静态内部类的重点是不具有封闭类的实例。
答案 1 :(得分:1)
m.new B();
是实例化嵌套静态类的不正确方式,因为B不是Main类的实例变量 - 所以不需要Main的实例来创建它。相反,你可以做到
new Main.B();
为了清晰起见,从docs引用
静态嵌套类与其外部类(和其他类)的实例成员交互,就像任何其他顶级类一样。实际上,静态嵌套类在行为上是一个顶级类,它已嵌套在另一个顶级类中以方便打包。