Java作用域规则和内部类

Java作用域规则和内部类,java,inner-classes,scoping,Java,Inner Classes,Scoping,所有疯狂的Java作用域规则都让我头晕目眩,公共静态无效的废话对事情没有帮助。到目前为止,我使用的所有编程语言要么是词法作用域,要么是它的近似值,没有任何访问修饰符,即内部内容捕获外部内容,只要内部内容存在,就可以访问外部内容 那么,我如何理解Java中内部类的作用域规则呢?他们是否可以访问外部类中声明的变量,或者是否有一些奇怪的边缘情况需要我担心,因为所有的公共静态私有内容都在浮动?您必须区分: 静态内部类可以访问其声明之外的所有静态成员 实例内部类可以访问其声明之外的所有类成员,以及它们在

所有疯狂的Java作用域规则都让我头晕目眩,公共静态无效的废话对事情没有帮助。到目前为止,我使用的所有编程语言要么是词法作用域,要么是它的近似值,没有任何访问修饰符,即内部内容捕获外部内容,只要内部内容存在,就可以访问外部内容


那么,我如何理解Java中内部类的作用域规则呢?他们是否可以访问外部类中声明的变量,或者是否有一些奇怪的边缘情况需要我担心,因为所有的公共静态私有内容都在浮动?

您必须区分:

  • 静态内部类可以访问其声明之外的所有静态成员
  • 实例内部类可以访问其声明之外的所有类成员,以及它们在其中声明的函数中的最终字段
请记住,非静态内部类也有一个带有外部类实例的隐藏变量,用于访问其中的成员。当内部类被实例化时,所有引用的final字段(因此它们必须是final)都被复制到其他隐藏成员变量中的内部类中

例如:

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中内部类的规则

  • 在Java中,可以在另一个类中定义一个类,这些类称为嵌套类或内部类
  • 有3种类型的内部类实例内部类、静态内部类和匿名内部类
  • 如果内部类被声明为实例内部类,那么它可以访问外部封闭类的所有成员,包括私有成员
  • 如果内部类被声明为静态的,那么它只能访问外部类的静态成员(包括私有静态成员)。但它无法访问实例成员
  • 假设在外部类和实例内部类中都定义了变量x,那么从内部类访问变量的一般形式是
    this.x
    (内部x)和
    OuterClassname.this.x
    (外部x)
  • 还可以在任何方法或任何其他块内定义内部类
  • 从外部实例化内部类的一般形式