Java作用域规则和内部类
所有疯狂的Java作用域规则都让我头晕目眩,公共静态无效的废话对事情没有帮助。到目前为止,我使用的所有编程语言要么是词法作用域,要么是它的近似值,没有任何访问修饰符,即内部内容捕获外部内容,只要内部内容存在,就可以访问外部内容Java作用域规则和内部类,java,inner-classes,scoping,Java,Inner Classes,Scoping,所有疯狂的Java作用域规则都让我头晕目眩,公共静态无效的废话对事情没有帮助。到目前为止,我使用的所有编程语言要么是词法作用域,要么是它的近似值,没有任何访问修饰符,即内部内容捕获外部内容,只要内部内容存在,就可以访问外部内容 那么,我如何理解Java中内部类的作用域规则呢?他们是否可以访问外部类中声明的变量,或者是否有一些奇怪的边缘情况需要我担心,因为所有的公共静态私有内容都在浮动?您必须区分: 静态内部类可以访问其声明之外的所有静态成员 实例内部类可以访问其声明之外的所有类成员,以及它们在
那么,我如何理解Java中内部类的作用域规则呢?他们是否可以访问外部类中声明的变量,或者是否有一些奇怪的边缘情况需要我担心,因为所有的公共静态私有内容都在浮动?您必须区分:
- 静态内部类可以访问其声明之外的所有静态成员
- 实例内部类可以访问其声明之外的所有类成员,以及它们在其中声明的函数中的最终字段李>
public void doStuff(final int a, int b) {
final int c; // Can be referenced
int d; // Cannot be referenced, not final
executer.execute( new Runnable() {
public void run() {
System.out.println("a: "+a+" c: "+c);
}
}
b++; // Not final, not referencable
System.out.println(b);
}
静态嵌套类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();
然后,内部
将其第二个字段设置为引用外部
注意,“限定的new
operator”语法仅用于内部类;如果I
是一个static
嵌套类,那么它就没有必要(实际上是一个错误)
1您经常会遇到“静态内部类”这一短语(令人尴尬的是,在这个答案的早期版本中也有)。这是不正确的术语。在Java中,“内部类”特别是非
静态嵌套类。我不知道它是否有用,但从以下方面:
静态嵌套类
与类方法和变量一样,静态嵌套类与其外部类相关联。与静态类方法一样,静态嵌套类不能直接引用其封闭类中定义的实例变量或方法,只能通过对象引用使用它们。
注意:静态嵌套类与其外部类(和其他类)的实例成员进行交互,就像任何其他顶级类一样。实际上,静态嵌套类在行为上是一个顶级类,为了便于打包而嵌套在另一个顶级类中
内部类[非静态嵌套类?]
与实例方法和变量一样,内部类与其封闭类的实例相关联,可以直接访问该对象的方法和字段。此外,由于内部类与实例相关联,因此它本身无法定义任何静态成员
您应该检查。内部类的规则
方法作用域的内部类:-
只能访问外部类的最终成员。Java中内部类的规则
this.x
(内部x)和OuterClassname.this.x
(外部x)