【发布时间】:2018-06-11 20:43:56
【问题描述】:
我在探索 Java 的增强 for 循环时编写了以下测试:
class test
{
int number = 0;
public static void main(String args[]) {
new test();
}
public test() {
int[] numbers = getNumbers();
for(int number : numbers) {
System.out.println("number : " + number);
System.out.println("numbers[0]: " + numbers[0]);
numbers = getNumbers();
}
}
public int[] getNumbers() {
number++;
int[] numbers = new int[5];
for(int i = 0; i < numbers.length; i++)
numbers[i] = number;
return numbers;
}
}
我惊讶地发现我的测试被输出了:
number : 1
numbers[0]: 1
number : 1
numbers[0]: 2
number : 1
numbers[0]: 3
number : 1
numbers[0]: 4
number : 1
numbers[0]: 5
然后看起来numbers 的一个单独实例是在第一次执行循环时创建的,并且是不可变的。从那里开始,对numbers 所做的任何更改都只会对存在于循环条件之外的版本进行。
我已确认行为至少与此类似,方法是将循环替换为:
for(int number : numbers) {
System.out.println("number : " + number);
numbers = null;
}
给了:
number : 1
number : 1
number : 1
number : 1
number : 1
我的问题是:这里隐藏了哪些行为?是否复制了numbers 的第二个版本?它实际上是不可变的,还是我没有足够努力地戳它?换句话说:
增强的 for 循环背后发生了什么?
【问题讨论】: