《String类对象通过形参传递到函数中,在函数体中修改该引用后,外部引用不能获取到更改后的值》

一、原因

String类的存储是通过final修饰的char[]数组来存放结果的,不可更改。故每次当外部一个String类型的引用传递到方法内部时,只是把“外部String实例对象”的引用传递给了方法参数变量,使得外部String类型变量和方法参数变量都是实际char[]数组的引用而已。当我们在方法体中改变这个参数的引用时,因为char[]数组是不可变的,故每次修改都会导致创建一个新的String实例对象,而方法体中的方法参数就会指向这个新创建的String实例对象,而非指向原来外部的String实例对象了。故从方法执行前到方法执行后,外部String类型的引用始终指向原String实例对象。

二、例子

public class test
{
       public static void modify(String text)
       {
              text = "app";
       }
       public static void main(String[] args)
       {
              String s = "apple";
              System.out.println("修改前:"+ s);
              modify(s);
              System.out.println("修改后:"+ s);
       }
}

运行结果:

修改前:apple

修改后:apple

三、例子剖析

设s指向内存空间A,内存空间A存放了“apple”这个字符串,然后调用modify方法将s引用传递(赋值)给了text引用,为传址方式!但String是不可变的,任何更改都会产生新的String实例对象,并将其存放在某个内存空间。故在modify方法体中text指向的不是外部的“apple”实例对象,不是指向内存空间A,而是指向新创建的“app”实例对象(存放在内存空间B),指向内存空间B!但此时外部的String引用变量s仍然指向内存空间A,仍然指向“apple”实例对象!

四、辅助图示

示意图

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值