关于引用传递的个人理解

本文通过两个示例探讨了Java中字符串与对象的传递机制,解释了为何字符串内容无法直接被方法修改,而对象属性可以通过方法成功修改的现象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

相信还有很多和我一样的编程小白遇到过这样的问题:

 

        public static void main(String[] args){

                    String str ="abcd";

                    change(str);

                    System.out.println(str);  //第一个位置

                    str = "cc";

                    System.out.println(str);  //第二个位置

          }

          public static void change(String s){

                    s = "cc";

          }

在第一个位置会输出:abcd

在第二个位置会输出:cc

第二个位置的输出我们不难理解,但是第一个位置我明明调用了change方法对于字符串d值进行了修改,但是为什么回到main函数进行打印的时候,却并没有发生修改呢?

对于这样的情况需要从内存空间的分配上面去理解一下:

String str ="abcd";

这条语句创建了一个新的对象str,并且str的地址指向了堆内存中的"abcd"


接下来调用change方法,并且传入参数str,change方法中的变量s此时指向"abcd"


在change方法中进行了操作,将s指向了"cc"


此时打印str,我们自然发现str指向的还是abcd。

 


我们再看下面的代码:

首先我创建一个类Chestnuts,它具有一个参数str:

class Chestnuts {

        Stringstr;

}

然后在main函数中进行了如下操作:

        public static void main(String[] args){

               Chestnutscn = new Chestnuts();

               cn.str= "abcd";

               System.out.println(cn.str);  //第一个位置

               change(cn);

               System.out.println(cn.str);  //第二个位置

        }

        publicstatic void change(Chestnuts c){

               c.str= "cc";

        }

在第一个位置打印:abcd

在第二个位置打印:cc

那么为什么这样操作就能够对于对象cn的str属性进行修改呢?我们同样从内存分配的角度去观察:

首先,在创建了Chestnuts类的对象cn,并且将cn的str属性赋值为"abcd"之后,内存的状态是这样的:

                  

在调用change方法时,将cn作为参数传入,在change方法运行的内部,变量c指向了cn所指向的Chestnuts实例:

                  

当change方法内执行c.str = "cc"操作时,发生了如下变化:

                  

注意:这个时候c所指向的地址仍然是cn所指向的Chestnuts实例,所做的str参数修改可以看作是该Chestnuts内部的操作。

所以,当再次打印cn的str属性时,我们发现它发生了修改。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值