【发布时间】:2014-03-06 08:35:53
【问题描述】:
我对变量范围有疑问。
public static void main(String[] args){
int[] test={1,2,3};
test(test);
System.out.println(test[0]+" "+test[1]+" "+test[2]);
}
static void test(int[] test){
test[0]=5;
}
我希望输出为1 2 3,但结果是5 2 3。
为什么我在方法中改变了数组中的值,而原来的数组却改变了?
【问题讨论】:
-
因为你正在修改对象的状态...
-
不要被参数名弄糊涂了。在
test(..)方法中将参数名称更改为whatever,它不会影响任何内容。 -
致 OP:这与范围无关。您将对象引用值传递给方法,并通过方法内的该引用修改对象。这就是Java(和C,以及......)的工作方式。见:Oracle tutorial on the subject
-
@SotiriosDelimanolis 将按值传递,如果您考虑一下(我的意思是,考虑仅传递数组的值),那将是正确。但是您改为传递引用的副本,因此如果您更改对象的状态(在本例中为数组中的条目),那么 original 对象也将被修改。跨度>
-
int[] temp=test不会创建新的数组对象,它只是将数组引用(即指针)从“test”复制到“temp”。