【发布时间】:2020-05-06 15:38:53
【问题描述】:
对于 Java 中的不同类,增强型 for 循环 (EFL) 变量的范围是否不同?
当我在包含 Integers 的 ArrayList 上使用 EFL 时,我无法直接修改它们的值,但是如果我对下面代码中定义的 SimpleObjects 的 ArrayList 执行相同的操作,我可以毫无问题地更改实例变量的值。
import java.util.ArrayList;
class SimpleObject{
public int x;
public SimpleObject() {
this.x = 0;
}
}
public class Simple {
public static void main(String args[]){
// Create an arraylist of Integers and SimpleObjects
ArrayList<Integer> intList = new ArrayList<Integer>();
ArrayList<SimpleObject> soList = new ArrayList<SimpleObject>();
// Add some items to the arraylists
intList.add(1);
intList.add(2);
soList.add(new SimpleObject());
soList.add(new SimpleObject());
// Loop over the arraylists and change some values
for (Integer _int : intList) {
_int = 3; // Why doesn't this work but so.x = 5 below does?
}
for(SimpleObject so : soList) {
so.x = 5;
}
// Loop over the arraylists to print out values
for (Integer _int : intList) {
System.out.println("integer = " + _int);
}
for(SimpleObject so : soList) {
System.out.println(" x = " + so.x);
}
}
}
实际输出:
integer = 1
integer = 2
x = 5
x = 5
预期输出:
integer = 3
integer = 3
x = 5
x = 5
所以我的问题是为什么_int = 3; 不坚持第一个 EFL,但 so.x = 5; 坚持第二个 EFL?
【问题讨论】:
-
_int是对Integer的引用的副本,因此您要重新分配_int变量,它是local到for循环迭代。一旦退出循环,_int变量就会超出范围,Integer对象将被垃圾收集(如果它没有被Integer类缓存,但那是另一回事了)。