首页 新闻 会员 周边

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

0
[待解决问题]

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

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

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

lukely的主页 lukely | 初学一级 | 园豆:147
提问于:2020-03-10 17:54
< >
分享
所有回答(1)
0

都是传值
可以把引用看成是一个地址,传递引用其实是传递引用的地址值

wengle | 园豆:567 (小虾三级) | 2020-03-10 21:16

如有帮助,请采纳~~~,谢谢

支持(0) 反对(0) wengle | 园豆:567 (小虾三级) | 2020-03-10 22:34

也就是说,把按值传递,理解为传递引用的值。而不是对象的值。这个理解,有点欠缺说服力。

支持(0) 反对(0) lukely | 园豆:147 (初学一级) | 2020-03-11 11:06

@lukely: new出来的对象都有个唯一的地址,这个地址值,传给形参,所以也就是传值
传递引用的值也就是传递这个对象的地址值,这么理解没啥问题

如有帮助,请采纳~~~,谢谢
C++中的引用其实是个对象起了一个别名

支持(0) 反对(0) wengle | 园豆:567 (小虾三级) | 2020-03-11 11:34

如有帮助,请采纳~~~,谢谢

支持(0) 反对(0) wengle | 园豆:567 (小虾三级) | 2020-03-12 09:27
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册