Java习题-03值传递机制

/**
 * @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中,使得存在两个引用指向同一块存储单元。

Java习题-03值传递机制

public void change(String atr, char[] ah) {
    atr = "bad";
    ah[0] = 'b';
}

1.该代码块为change()方法的源码,其中atr = "bad"; 是赋值语句,使得编译器重新开辟一块存着"bad"的存储单元,并将形参atr指向该存储单元。

但String不可变,实参str此时仍指向"good",这就使得str的输出结果仍为"good"。

Java习题-03值传递机制

 

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

 

 

上一篇:实验四(刘卓伦)


下一篇:自定义组件的v-model(v-model的实现原理)