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。