代碼:
public class Test {
public static void main(String[] args) {
int a = 20;
method1(a);
System.out.println("int..." + a);
Person p = new Person("張三");
method2(p);
System.out.println("Person..." + p);
String str = "A";
method3(str);
System.out.println("String..." + str);
}
public static void method1(int a){
a = 10;
}
public static void method2(Person p){
p.setName("李四");
}
public static void method3(String str){
str = "B";
}
}
結果:
解釋int類型沒有被改變的原因
傳參的時候傳過去的是一個變量副本,方法內改變的是變量副本的值,而不是真正a的值,然後再根據就近原則,使用的就是 int a = 20
解釋Person類型被改變的原因
雖然最後還是就近原則,使用main方法中的p,但是它只是引用的一個地址,真正的值以及被改變了。
解釋String類型沒有被改變的原因
首先要知道常量池中的字符串一旦被創建是無法被改變的。
最後還是因爲就近原則,選用main方法中的str的值輸出。
總結:基本數據類型作爲方法參數,傳遞的是變量副本,形參改變,實際值不會改變,所以原樣輸出。引用型數據類型作爲方法的形參傳遞,傳遞的是引用地址,形參改變,實際值也會跟着改變。最後一種就是字符串,雖然屬於引用型數據類型,但是因爲字符串常量池的原因,字符串一旦被創建就不可改變的概念,給這個形參字符串賦值就相當於又創建了一個新的字符串,與原來的字符串已經沒有啥關係了,所以原來的字符串指向的還是字符串A,最終根據作用域輸出的還是A。