在java中:
基本类型作为参数传递时,是传递值的拷贝,无论你怎么改变这个拷贝,原值是不会改变的
在Java中对象作为参数传递时,传递的是引用的拷贝,既不是引用本身,更不是对象。
总结:
1:对于值类型的参数来说,传递的是值的拷贝.
2:对于引用类型的参数来说,传递的是引用本身的拷贝.
所以关键要看你如何理解传值中的这个“值”了。
实例:
public class ReferTest {
public static void call(Test t) {
Test t2 = new Test();
t = t2 ;
t2.setName("cba");
t.setName("abc");
System.out.println(t.getName());
System.out.println(t2.getName());
}
public static void test(int i){
i+=1;
System.out.println(i);
}
public static void main(String[] arg){
/**引用传递测试*/
Test obj = new Test();
call (obj);
System.out.println("obj"+obj.getName());
/**基本类型传递*/
int z = 0;
test(z);
System.out.println(z);
}
}
class Test{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
打印结果:
abc
abc
objnull
1
0
分析:
1、当调用call (obj);方法时,打印:abc,abc是可以理解的,不好理解的是System.out.println("obj"+obj.getName());
打印出来的objnull,obj明明已经作为参数传递进去了,为什么会打印一个null呢?
对于引用类型的参数来说,传递的是引用本身的拷贝.
也就是说传递给call方法的参数是Test类的一个实例的引用的拷贝,这个拷贝刚进到call方法当中时,确实也指向Test的一个实例对象:Test obj = new Test();
但是下面一句代码:t = t2 ;将这个指向改变了,它已经不再指向obj这个对象,而是Test t2 = new Test(); 这个对象。
这样就没有了针对对象Test obj = new Test();的任何操作,所以当打印System.out.println("obj"+obj.getName());
结果为objnull
2、从1,0的打印结果来看,在结合上面的理论:
基本类型作为参数传递时,是传递值的拷贝,无论你怎么改变这个拷贝,原值是不会改变的
这样就不用什么解释,已经解释的很好了