包含实例和作用域的内部类



很多标准书籍(例如。有效的 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箭头函数的"封闭作用域"所混淆

最新更新