内部 Class 封闭实例和范围

Inner Class Enclosing Instance and Scope

很多标准书籍(例如 Effective Java)和参考文献 material 指的是 封闭实例封闭范围讨论内在时类。这也在其他问题中讨论过No Enclosing instance error and Anonymous classes enclosing instances

对于非静态嵌套(内部)类,封闭实例和范围意味着什么?相应地,为什么我们不必担心在静态嵌套 类?

中包含实例

假设我们有一个 class Foo 静态嵌套和内部 class(Types of Nested Classes):

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
    }                               // |
  }                                 // |
  // <---------------------------------|
}

可以看出,class InnerFoo的封闭作用域就是InnerFoo声明处对应的作用域(blocks/methods/types)

现在,如果我们想使用 InnerFoo class 我们需要:

Foo f = new Foo(); // enclosing instance needed to construct InnerFoo
Foo.InnerFoo ifoo = f.new InnerFoo();
ifoo.world();

如注释中所标记,封闭实例 是我们需要创建的实例(此处为 Foo)以构造非静态嵌套 class.

最后,如果我们有一个静态嵌套 class,我们不需要 Foo 的封闭实例,可以直接引用它:

Foo.StaticNestedFoo sfoo = new Foo.StaticNestedFoo();
sfoo.world();

class 的静态成员 variable/method 由 class 的所有实例共享,因此可以通过 class 名称直接访问。以类似的方式,静态嵌套 class 可以被认为是独立于任何实例的,因此 不需要 需要构建封闭实例。

Source Code

相关:What is enclosing scope in Java?, really confused by "enclosing scope" of javascript es6 arrow function