您的位置:首页 > 编程语言 > Java开发

Java String类 传参的问题

2016-07-08 16:39 417 查看
疑问来自于这段代码

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

这样的话,也就是新的实例保存了在函数中更改后的值,这样,跳出局部函数之后,局部变量出栈,原先传入的参数其实是没有改变的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: