实例化静态嵌套 类
Instantiating static nested classes
这个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 行我们有一个静态 class 定义,它不应该也可以从对象 m 访问吗?
编辑
如果Main
有一个静态变量i
,m.i
不会导致编译错误。为什么行为与 class 定义不同?
没有
静态内部 class 的全部意义在于它 没有 包含 class.
的实例
m.new B();
是实例化嵌套静态 class 的不正确方法,因为 B 不是 class Main 的实例变量 - 因此不需要 Main 的实例来创建它。相反你可以做
new Main.B();
为清楚起见,引用自docs
A static nested class interacts with the instance members of its outer class (and other classes) just like any other top-level class. In effect, a static nested class is behaviorally a top-level class that has been nested in another top-level class for packaging convenience.
这个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 行我们有一个静态 class 定义,它不应该也可以从对象 m 访问吗?
编辑
如果Main
有一个静态变量i
,m.i
不会导致编译错误。为什么行为与 class 定义不同?
没有
静态内部 class 的全部意义在于它 没有 包含 class.
的实例m.new B();
是实例化嵌套静态 class 的不正确方法,因为 B 不是 class Main 的实例变量 - 因此不需要 Main 的实例来创建它。相反你可以做
new Main.B();
为清楚起见,引用自docs
A static nested class interacts with the instance members of its outer class (and other classes) just like any other top-level class. In effect, a static nested class is behaviorally a top-level class that has been nested in another top-level class for packaging convenience.