匿名类中的最终变量
问题描述:
我有一个匿名类,它从集合中获取迭代值,如下所示。通过这段代码,是否在匿名类中保留了直接变量in
?或不同的线程可以采取相同的in
值?匿名类中的最终变量
List<Integer> list = new ArrayList<>();
for (int i = 1; i <= 20; i++)
list.add(i);
for (final Integer in : list) {
new Thread(new Runnable() {
@Override
public void run() {
Thread.sleep(1000);
System.out.println(value + "," + in);
}
}).start();
}
答
是的,in
每个值在每个创建的Thread
S的被保留。只要它声明为final
,或者如果您使用的是Java 8,如果它是“有效的最终”(不是final
但未更改),则可以在匿名内部类中使用局部变量。
答
你不能有一个变量作为final,并给它一个新的值。最后意味着:价值是不可改变的,也是最终的。
而且因为它是最后的,Java可以安全地将其复制到本地匿名类
我不明白你在问什么。在这种情况下,你为每个20个线程传递一个不同的'in'值。那是你想知道的吗? – 2014-11-06 23:02:01
我的问题是两个线程可以共享相同的值吗? – vinayag 2014-11-06 23:04:48
另外我认为迭代集合上的迭代隐式转换为循环的正常循环,其中包含相同的变量。所以我很困惑,每次迭代集合时是否都会创建一个新的'in'变量。 – vinayag 2014-11-06 23:06:52