java - Java 前向引用在不同情况下的行为是否不同?

标签 java compiler-construction inner-classes local-class

请看这个片段:

public class A {
    void method() {
        System.out.print(B.j);//This is legal!
        class C {
            void method () {
                System.out.print(j);//This is illegal!
            }
        }
        final int j = 10;
        class D {
            void method() {
                System.out.print(j);//This is legal!
            }
        }
    }
}
class B {
    static int j = 10;
}

我们可以在定义之前的某个地方访问“B.j”,而在类 C 中访问“final int j”的情况下这是非法的。

java 编译器是否将本地类视为简单的变量/对象?特别是,这种行为背后的基本原理是什么?我的意思是前向检查适用于 B.j,但不适用于 C 类中的“j”。

最佳答案

我相信这是简单的范围界定。如果您用简单的 System.out.println() 调用替换您的内部类,

public class A {
  void method() {
    System.out.print(j);//This is illegal!
    final int j = 10;
    System.out.print(j);//This is legal!
  }
}

您会发现您收到了相同的消息。局部变量的范围从声明它们的地方开始,一直持续到声明它们的 block 的末尾。

回答你关于引用 B 的问题:考虑

public class A {
  void method() {
    System.out.print(k);//This is legal!
  }
  int k=17;
}

Java 不是单程编译。可以向前引用类及其公开的字段和方法。有意决定局部变量不能被前向引用。我猜这是为了让程序员建立受限范围,而不必使用额外级别的 {} block 语句——如果我引入一个新变量,尤其是初始化时,我不想任何人在此之前篡改它。

Java 局部变量恰好就是这样工作的。这可能不是一个令人满意的答案,但它是我们得到的最好的答案。

关于java - Java 前向引用在不同情况下的行为是否不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22110836/

相关文章:

java - 对多个 for 循环使用单个整数有什么好处?

java - 如何计算桥接法目标

java - 如何在jsp中打印图像(大量)

parsing - 从生成的解析表中检索语法规则

linux - ELF64 文件是什么样的?

java - 验证字符串是用 Java 编码的 UTF-8

java - mac 上的 Android Studio : cant find System compiler

java - 在范围内无法访问 OuterClass.StaticNestedClass 类型的封闭实例

java - 为简单功能创建内部类是一种好习惯吗?

java - 局部内部类是否在定义它们的范围内维护所有局部变量的副本?