java方法传String类型的参数时,为啥方法对值的修改没有在方法之外生效?

//示例1:对象类型
public class PassReferByValue  
{  
    String a = "123";  
    public static void test(PassReferByValue test)  
    {  
        test.a = "abc";  
    }  
  
    public static void main(String[] args)  
    {  
        PassReferByValue test = new PassReferByValue();  
        System.out.println("对象的数据的初始值是:" + test.a); //123 
          
        test(test);  
        System.out.println("通过调用test方法修改对象的数据的值之后:" + test.a); //abc  
          
    }  
} 
总结:因为是对象类型,所以方法每次修改对象的数据的值之后,都在方法之外生效了,也就是说,在方法之外和在方法之内访问到的对象的数据的值是一致的。
//示例2:String类型
public class Test  
{  
    public static void test(String str)  
    {  
        str = "word";  
    }  
  
    public static void main(String[] args)  
    {  
        String string = "hello";  
        System.out.println("对象的数据的初始值是:" + string);  //hello  
        test(string);  
        System.out.println("通过调用test方法修改对象的值之后还是以前的值:" + string);  //hello  
    }  
}

示例一确实是对对象的数据的修改,但是示例二却是对参数本身的修改

不管是值传递还是引用传递,其实本质上都是值传递,方法调用的时候 计算出参数的值,拷贝一份给对应的参数

只是对于对象类型,传递的是对象的引用(或者理解为指针,地址)值,虽然参数拿到的是拷贝的引用,但是和原引用指向的是同一个对象,因此根据这个引用可以操作到原对象的数据

你的示例二中,调用方法时,计算参数string的值(可以理解为hello这个字符串对象在内存中的地址),拷贝给参数str,参数str虽然拿到了原来hello字符串对象的引用(即str的值等于string的值,也即hello的地址),但是立马给这个参数重新赋值,这个时候str参数已经跟hello字符串没有任何关系了,str不再指向hello,改指向world了,但是这个过程中hello自身以及hello在内存中的地址没有任何变化,方法外部的string变量也一直指向hello这个字符串对象,没有任何变化

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值