Java String类 传参的问题



疑问来自于这段代码

public class Test1 {  
    public static void changeStr(String str) {  
        str = "welcome";  
    }  
 
    public static void main(String[] args) {  
        String str = "1234";  
        changeStr(str);  
        System.out.println(str);  
    }  
}


输出值是"1234"。
为什么?Java里对象传参不是引用传递吗?为什么str没有变么?

上网查找了下相关博客,找到一篇极好的:
http://freej.blog.51cto.com/235241/168676

总结下博客里的关于这个问题的精简回答:
String 内部实现使用char[],类似于Integer是int的包装类,Float是float的包装类一样,包装类在传参数时会体现基本类型的性质(所以包装类传参时不仅是String,而是都会有通过引用修改对象,但出了函数体后,对象并没有修改成功的问题)

再往深挖,包装类传参为什么体现基本类型的性质?


这是因为基本类型和包装类型都有以下特征:
  • 所有实例都是只读的,也就是说包装类中对实际的value没有setter方法,其包装类所有方法都无法修改实际的value本身,而是通过方法修改返回一个新的value,这就导致每一次赋值,其实都是创建了一个新实例。
  • 此外,用基本类型对包装类赋值,同样会导致创建一个新的实例。
这样的话,也就是新的实例保存了在函数中更改后的值,这样,跳出局部函数之后,局部变量出栈,原先传入的参数其实是没有改变的。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值