很多标准书籍(例如。有效的 Java( 和参考资料是指在讨论内部类时封闭实例和封闭作用域。这在其他问题中也进行了讨论,也没有封闭实例错误和匿名类封闭实例。
封闭实例和作用域对于非静态嵌套(内部(类意味着什么?相应地,我们为什么不必担心将实例封装在静态嵌套类中呢?
假设我们有一个带有静态嵌套和内部类(嵌套类类型(的类Foo:
public class Foo{
// <---------------------------|
void hello() { // |
System.out.print("Hello");// enclosing scope of InnerFoo
} // |
// <---------------------------|
public class InnerFoo{
void world() {
System.out.print("World");
}
}
// <---------------------------------|
public static class StaticNestedFoo{ //|
void world() { // |
System.out.print("World"); // enclosing scope of InnerFoo
} // |
} // |
// <---------------------------------|
}
可以看出,类 InnerFoo 的封闭作用域是对应于声明 InnerFoo 的位置的作用域(块/方法/类型(。
现在,如果我们想使用 InnerFoo 类,我们需要:
Foo f = new Foo(); // enclosing instance needed to construct InnerFoo
Foo.InnerFoo ifoo = f.new InnerFoo();
ifoo.world();
如注释中所标记的,封闭实例是我们需要创建的实例(此处Foo
(,以便构造非静态嵌套类。
最后,如果我们有一个静态嵌套类,我们不需要 Foo 的封闭实例,可以直接引用它:
Foo.StaticNestedFoo sfoo = new Foo.StaticNestedFoo();
sfoo.world();
类的静态成员变量/方法由类的所有实例共享,因此可直接通过类名访问。以类似的方式,静态嵌套类可以被认为是独立于任何实例的,因此不需要构造封闭实例。
源代码
相关:Java中的封闭作用域是什么?,真正被javascript es6箭头函数的"封闭作用域"所混淆