/** * @author: TSCCG * @date: 2021/4/27 * 值传递机制 */ public class StringTest { String str = new String("good"); char[] aw = { 't', 'e', 's', 't' }; public void change(String atr, char[] ah) { atr = "bad"; ah[0] = 'b'; } public static void main(String[] args) { StringTest st = new StringTest(); System.out.println("str:" + st.str); System.out.println(st.aw); st.change(st.str, st.aw); System.out.println("str:" + st.str); System.out.println(st.aw); } }
运行结果:
str:good test str:good best
1.思考问题:
为什么String定义的对象str的值没有发生改变,而数组aw却改变了呢?
2.代码分析
st.change(st.str, st.aw);
这行代码调用了change()方法,拷贝了实参的地址到该方法中的形参上面,如实参str就将指向"good"的存储单元地址传入形参atr中,使得存在两个引用指向同一块存储单元。
public void change(String atr, char[] ah) { atr = "bad"; ah[0] = 'b'; }
1.该代码块为change()方法的源码,其中atr = "bad"; 是赋值语句,使得编译器重新开辟一块存着"bad"的存储单元,并将形参atr指向该存储单元。
但String不可变,实参str此时仍指向"good",这就使得str的输出结果仍为"good"。
2.ah[0] = 'b'; 该语句使用下标赋值,不会创建新的对象,故结果改变
3.解决方法
在change()方法中将形参地址赋给实参
public void change(String atr, char[] ah) { atr = "bad"; // 这里将形参的地址赋给实参 str = atr; ah[0] = 'b'; }
运行结果:
str:good test str:bad best