天天看点

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,这就导致每一次赋值,其实都是创建了一个新实例。
  • 此外,用基本类型对包装类赋值,同样会导致创建一个新的实例。

这样的话,也就是新的实例保存了在函数中更改后的值,这样,跳出局部函数之后,局部变量出栈,原先传入的参数其实是没有改变的。