让我们看一下下面的代码(让A
成为同一个包中的一个简单类):
public class MyClass {
public void outer() {
int i=3;
int j=i++; // 1
A a = new A() {
int k = i++; // 2
};
}
}
虽然行1
编译没有问题,但行2
会生成以下编译错误:
在封闭范围内定义的局部变量必须是final或 有效地
将final
分配给变量i
会导致行1
和行2
中的编译错误(这是合理的,因为您无法更改最终变量)。
第2
行编译错误背后的原因是什么?
这也发生在下一个代码块中:
public class MyClass {
public void outer() {
A[] arr = new A[10];
for (int i=0 ; i<10 ; i++) {
arr[i] = new A() {
private int j = i; // 1
};
}
}
}
在行1
中导致相同的编译错误。但是,如果代码中有以下更改(在标记的行1
和2
处),则不会出现编译错误:
public class MyClass {
public void outer() {
A[] arr = new A[10];
for (int i=0 ; i<10 ; i++) {
final int k = i; // 1
arr[i] = new A() {
private int j = k; // 2
};
}
}
}
我试图了解这个编译选择背后的原因,但我无法理解它们到底是什么。我猜这与方法对变量的可能改变有关,但我不确定我是否完全理解。