许多标准书(例如,Effective Java)和参考资料都引用了封闭实例和封闭范围。 No Enclosing instance error和Anonymous classes enclosing instances也已在其他问题中进行了讨论。
封闭实例和范围对于非静态嵌套(内部)类是什么意思?相应地,为什么我们不必担心将实例包含在静态嵌套类中呢?
比方说,我们有一个带有静态嵌套内部类(Types of Nested Classes)的类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();
类的静态成员变量/方法由该类的所有实例共享,因此可以通过类名称直接访问。以类似的方式,可以将静态嵌套类视为独立于任何实例,因此not
相关:What is enclosing scope in Java?,really confused by "enclosing scope" of javascript es6 arrow function