我仍然对有关匿名类和最终字段的解释不满意。有大量问题试图解释明显的问题,但我还没有找到所有问题的答案:-)
假设以下代码:
public void method(final int i, int j) {
final int z = 6;
final int x = j;
int k = 5;
new Runnable() {
public void run() {
System.out.print(i);
System.out.print(x);
System.out.print(z);
System.out.print(k);
}
};
}
- 由于“unfinal”,无法编译此代码
k
财产。
- 我知道编译器可以替换
z
编译时具有声明值的属性。
当我寻找解决方案时,到底如何工作i
and x
我找到了这个answer https://stackoverflow.com/questions/1299837/cannot-refer-to-a-non-final-variable-inside-an-inner-class-defined-in-a-differen其中说:
然后,编译器可以将匿名类中的lastPrice和price替换为常量的值(当然是在编译时),这样您就不会再遇到访问不存在的变量的问题了
它如何适用于领域i
and x
如果它们是方法的参数?它们在编译时是未知的?这种方法可以适用于z
.
另一方面,有一个关于堆栈问题 http://en.wikipedia.org/wiki/Final_%28Java%29#Final_and_inner_classes:
这允许 Java 编译器在运行时“捕获”变量的值并将副本存储为内部类中的字段。一旦外部方法终止并且其堆栈帧已被删除,原始变量就会消失,但内部类的私有副本仍保留在类自己的内存中
我会理解匿名类在创建过程中以某种方式复制了所有必需的内容(字段)。丢失的final
有一个明显的问题,如果某些代码below匿名类声明会改变值,执行时使用可能stale
价值观。
但是好的,这应该可以解决当匿名类的方法在所用属性的范围之外执行时的问题。
但这种方法应该有效even没有final
声明,因为它只是复制所有字段。
这两种方法对我来说似乎都是独立的。说到这里 - 它可以解决我的问题 - 我还没有找到如何工作final
方法字段。即使方法完成,它们也不会从堆栈中删除?对我来说似乎是无稽之谈,但它可以解释很多事情:-)
正确答案是什么?