java按值传递和按引用传递_java 到底是按值传递还是按引用传递?基本数据类型不用说了,只说引用类型...

前提:

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在交换前后没有发生变化。

这究竟算引用传递?还是算值传递?

如果是按值传递,那对象的内容又被改变了,该如何正确理解?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值