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