静态嵌套类1与外部类完全相同,不同之处在于它们可以访问外部类的所有成员,而与访问限定符无关。它们与外部类的任何实例分开存在,因此需要引用实例才能访问外部类的任何实例变量或非静态方法。
非静态嵌套类(称为 内部类
)仅在外部类的实例的上下文中才存在。构造后,它们会
this自动生成第二个字段,您可以使用语法从内部类中访问该字段
Outer.this。内部类的每个实例都被外部类的单个实例包围。同样,静态嵌套类的所有访问权限都适用于内部类。但是,由于它们已经具有可用的外部类实例,因此它们可以自动访问外部类的实例变量和方法。
要对内部类和访问说明符进行漂亮(非常详细)的讨论,可以阅读《
内部类说明》
。它描述了嵌套类如何访问
private其外部类的成员。嵌套类教程是比较温和的读物。
除了题外话:假设您具有以下类结构:
public class O { public O() { ... } public class I { // an inner class public I() { ... } ... } ...}
并且您创建了的实例
O:
O outer = new O();
现在假设您要创建的实例
O.I。您不能只使用它,
new O.I()因为新的实例
I需要包含在的特定实例中
O。为此,Java提供了以下语法:
O.I inner = outer.new O.I();
然后
inner将其第二个
this字段设置为引用
outer。
请注意,这种“合格的
new运算符”语法仅用于内部类。如果
I是
static嵌套类,则不必要(实际上是一个错误)。
1 您经常会遇到“静态内部类”一词(令人尴尬的是,在此答案的早期版本中包括)。这是不正确的术语。在Java中,“内部类”特别是非
static嵌套类。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)