前提:
1、如果是按引用传递,那对象会被改变。
2、如果是按值传递,那对象不会被改变。
真正产生疑惑的是,这个对象的改变,是按什么来算的。是按对象的内容被改变了,还是按对象的引用被改变了。我觉得应该按对象的内容算。因为多个引用可以指向同一个对象。
如果按这个“我觉得”,那毫无疑问,就是按引用传递。我始终不能信服那句干巴巴的话“java只有按值传递”。
目前用来证明java是按值传递的一个例子最具说服力的就是《java核心技术卷1》里的交换法,因为交换不过来,就认为对象没有被改变,就认定是按值传递。我觉得还是欠缺说服力的。
还请大神们多多指教:
先上代码:
package AnnotationTest;
public class Test {
public static void main(String[] args) {
Student x = new Student("校长");
Student y = new Student("小李");
/**
* 如果传的是引用,那交换之后,
*/
System.out.println("交换前:x "+x.hashCode()+" Y: "+y.hashCode());
System.out.println("交换前:x "+x.getName()+" Y: "+y.getName());
swap(x,y);
System.out.println("交换后:x "+x.hashCode()+" Y: "+y.hashCode());
System.out.println("交换后:x "+x.getName()+" Y: "+y.getName());
}
public static void swap(Student x,Student y){
Student temp = y;
// System.out.println("交换中temp:"+temp.hashCode()+" "+temp.getName());
y=x;
System.out.println("在y=x之后,我要修改X的值了");
x.setName("偷偷改了X的值");
x = temp;
System.out.println("交换中x:"+x.hashCode()+" X "+x.getName());
System.out.println("交换中y:"+y.hashCode()+" Y "+y.getName());
}
}
再看看输出:
交换前:x 1163157884 Y: 1956725890
交换前:x 校长 Y: 小李
在y=x之后,我要修改X的值了
交换中x:1956725890 X 小李
交换中y:1163157884 Y 偷偷改了X的值
交换后:x 1163157884 Y: 1956725890
交换后:x 偷偷改了X的值 Y: 小李
可以看见,在对象引用交换的过程中,的确发生了对象内容被改变的情况,但是也可以发现,对象的hashCode在交换前后没有发生变化。
这究竟算引用传递?还是算值传递?
如果是按值传递,那对象的内容又被改变了,该如何正确理解?