内部类封装实例和范围

问题描述 投票:-1回答:1
在讨论内部类时,

许多标准书(例如,Effective Java)和参考资料都引用了封闭实例封闭范围No Enclosing instance errorAnonymous classes enclosing instances也已在其他问题中进行了讨论。

封闭实例和范围对于非静态嵌套(内部)类是什么意思?相应地,为什么我们不必担心将实例包含在静态嵌套类中呢?

java inner-classes
1个回答
0
投票

比方说,我们有一个带有静态嵌套内部类(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

要求封闭的实例进行构造。

Source Code

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

© www.soinside.com 2019 - 2024. All rights reserved.