日期:2014-05-20  浏览次数:20857 次

数据引用的问题
请问下面两端代码

public class TestValue {
public static void main(String[] args) {
int a=10;
test(a);
System.out.println("The argument a is "+a);
}
public static void test(int a){
a =1;
System.out.println("The parameter is: "+a);
}
}
得到结果:
The parameter is: 1
The argument a is 10
我可以理解形参值的改变未能影响到实参,所以形参值在test方法中被重新定义了,而实参值仍保留10.

public class TestValue {
public static void main(String[] args) {
int []a = {1,2,3};
test (a);
System.out.println("The argument a[0] is "+a[0]);
}
public static void test(int[] a){
System.out.println("The original parameter is: "+a[0]);
a[0] =10;
System.out.println("The parameter is: "+a[0]);
}
}
得到的结果:
The original parameter is: 1
The parameter is: 10
The argument a[0] is 10
为何第二段代码的实参值会变化?而不是保留初始的值1?

------解决方案--------------------
数组的特性是一个 连续的,具有特定类型,大小相等的内存片段.
其实,数组是保存在 堆内存中的. 你看一下数组的 构造方式

有一种就是 String[] arg = new String[]{"a","s","d"}; 
 你说 new 出来的东西放置到哪里呢.

对吧.所以 内存地址已经做了修改.这是一个引用传递,不是一个简单的值传递啊.
------解决方案--------------------
楼主可以类似第一个程序,在第二个程序的test(int[] a)里,加一语句:
a=new int[3]; //在方法里重新给变量赋值。
看看结果。
------解决方案--------------------
数组是一个对象属于引用类型,传递的参数是对象地址修改的是对象所以输出的是修改之后的,原因他们都指向同一个对象,只要有一方修改了另一方访问的就是修改之后的。