请看这个片段:
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/