2019年Java大廠面試題講解(周陽) 之TransferValue是什麼?

值傳遞和引用傳遞

/**
 * 值傳遞和引用傳遞
 * @author: 輕狂書生
 * @create: 2020-04-14-18:25
 */
class Person {
    private Integer id;
    private String personName;

    public Person(String personName) {
        this.personName = personName;
    }
}
public class TransferValueDemo {

    public void changeValue1(int age) {
        age = 30;
    }

    public void changeValue2(Person person) {
        person.setPersonName("XXXX");
    }
    public void changeValue3(String str) {
        str = "XXX";
    }

    public static void main(String[] args) {
        TransferValueDemo test = new TransferValueDemo();

        // 定義基本數據類型
        int age = 20;
        test.changeValue1(age);
        System.out.println("age ----" + age);

        // 實例化person類
        Person person = new Person("abc");
        test.changeValue2(person);
        System.out.println("personName-----" + person.getPersonName());

        // String
        String str = "abc";
        test.changeValue3(str);
        System.out.println("string-----" + str);

    }
}

最後輸出結果

age ----20
personName-----XXXX
string-----abc

changeValue1的執行過程

八種基本數據類型,在棧裏面分配內存,屬於值傳遞

棧管運行,堆管存儲

當們執行 changeValue1的時候,因爲int是基本數據類型,所以傳遞的是int = 20這個值,相當於傳遞的是一個副本,main方法裏面的age並沒有改變,因此輸出的結果 age還是20,屬於值傳遞。

changeValue2的執行過程

因爲Person是屬於對象,傳遞的是內存地址,當執行changeValue2的時候,會改變內存中的Person的值,屬於引用傳遞,兩個指針都是指向同一個地址

changeValue3的執行過程

String不屬於基本數據類型,但是爲什麼執行完成後,還是abc呢?

這是因爲String的特殊性,當我們執行String str = "abc"的時候,它會把 abc 放入常量池中

當我們執行changeValue3的時候,會重新新建一個xxx,並沒有銷燬abc,然後指向xxx,然後最後我們輸出的是main中的引用,還是指向的abc,因此最後輸出結果還是abc。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章