内部类只能访问最终或有效的最终变量。我不明白,为什么无论如何都可以访问实例变量,但局部变量和方法参数必须至少有效地最终?
请考虑以下代码:
public class BookStore {
private static final int taxId = 300000;
public String name;
public String searchBook(final String criteria) {
int count = 0;
int sum = 0;
// name = ""; I can uncomment this -> no compile error
class Enumerator {
String interate(int k) {
System.out.println(name);
System.out.println(sum);
return "";
}
}
// sum++; If I uncomment this, a compile error will be thrown.
return "";
}
}
为什么局部变量+方法参数需要有效最终?
答案 0 :(得分:1)
这是因为局部变量的范围。它们的范围是声明它们的方法。一旦执行离开该方法,它们就不再有效。但是,诸如Enumerator类之类的内部类可以继续执行方法,例如,通过返回对类实例的引用。
因此,可以在声明它的方法之外访问Enumerator类及其方法。此时,它需要假设它引用的局部变量具有与执行实例化类时相同的值。
对于实例变量,这些变量和内部类的范围是相同的 - 只要父类实例存在,它们都可用。
答案 1 :(得分:1)
创建实例时,所有关于捕获的值都是如此。实例上下文中的内部类总是捕获不可变的外部this
引用¹,通过它可以访问,可变或不可访问实例字段。相反,局部变量只能通过其值捕获,因此,变量不得更改,以与捕获的值保持一致。
这是一个设计决定。从技术上讲,a)允许后续的突变不会被内部类的状态或b反射,将每个共享的局部变量包装到一个对象中,以允许像外部类的实例字段一样的突变,但不允许语言设计者认为不一致或非本地不变的局部变量。
¹这与lambda表达式不同,后者仅在实际访问实例变量时捕获this