gpt4 book ai didi

Java 作用域规则和内部类

转载 作者:搜寻专家 更新时间:2023-11-01 01:00:54 24 4
gpt4 key购买 nike

所有疯狂的 Java 作用域规则都让我头晕目眩,public static void 废话无济于事。到目前为止,我使用过的所有编程语言要么使用词法作用域,要么不使用任何访问修饰符对其进行某种近似,即内部内容捕获外部内容,只要内部内容存在,就可以访问外部内容。

那么我如何理解 Java 中内部类的作用域规则呢?他们是否可以访问在外部类中声明的变量,或者是否存在一些我不得不担心的奇怪的边缘情况,因为所有的 public static private 东西都在 float ?

最佳答案

静态嵌套类1 与外部类完全一样,除了它们可以访问外部类的所有成员,而不管访问限定符如何。它们独立于外部类的任何实例而存在,因此需要对实例的引用才能访问外部类的任何实例变量或非静态方法。

非静态嵌套类(称为内部类)仅在外部类实例的上下文中才存在。构造时,它们会自动生成第二个 this 字段,您可以使用语法 Outer.this 从内部类中访问它。内部类的每个实例都包含在外部类的单个实例中。同样,静态嵌套类的所有访问权限都适用于内部类。但是由于它们已经有可用的外部类实例,因此它们可以自动访问外部类的实例变量和方法。

有关内部类和访问说明符的精彩(且非常详细)讨论,您可以通读 Inner Class Specification .它描述了嵌套类如何访问其外部类的 private 成员等内容。更温和的阅读是 Nested Classes tutorial .

题外话:假设你有这样的类结构:

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 嵌套类。

关于Java 作用域规则和内部类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4848036/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com