我仍然对匿名类和最终字段的解释不满意。有很多问题试图解释明显的问题,但我还没有找到所有问题的答案:-)
假设以下代码:
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);
}
};
}
k
由于“unfinal”属性,无法编译此代码。- 我知道编译器可以
z
在编译期间用声明的值替换属性。
当我搜索解决方案时,究竟是如何工作i
的,x
我找到了这个答案,上面写着:
然后编译器可以将匿名类中 lastPrice 和 price 的使用替换为常量的值(当然是在编译时),并且您将不再有访问不存在的变量的问题
它如何适用于字段i
以及x
它们是否是方法的参数?他们在编译时不知道吗?这种方法可以为z
.
另一方面,有关于堆栈问题的解释:
这允许 Java 编译器在运行时“捕获”变量的值并将副本作为字段存储在内部类中。一旦外部方法终止并且它的堆栈帧被删除,原始变量就消失了,但内部类的私有副本仍然存在于类自己的内存中
我会理解匿名类在创建过程中以某种方式复制了所有必需的内容(字段)。Missingfinal
有一个明显的问题,如果匿名类声明下面的某些代码会更改值,则执行使用可能的stale
值。
但是好的,当匿名类的方法在使用的属性范围之外执行时,这应该可以解决问题。
但是这种方法即使没有final
声明也应该有效,因为它只是复制所有字段。
这两种方法对我来说似乎都是独立的。说到这——它可以解决我的问题——我还没有找到工作final
方法领域。即使方法完成,它们也不会从堆栈中删除?对我来说似乎是胡说八道,但它可以解释很多事情:-)
正确答案是什么?