内部 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 可以被认为是独立于任何实例的,因此 不需要 需要构建封闭实例。
相关:What is enclosing scope in Java?, really confused by "enclosing scope" of javascript es6 arrow function
很多标准书籍(例如 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 可以被认为是独立于任何实例的,因此 不需要 需要构建封闭实例。
相关:What is enclosing scope in Java?, really confused by "enclosing scope" of javascript es6 arrow function