代碼部分:
public static void main(String[] args) {
testInt();
testString();
testArray();
testX();
}
public static void testInt() {
int a = 1;
int b = a;
a = 2;
System.out.println("b = "+b);
changeInt(a);
System.out.println("a = "+a);
}
public static void testString() {
String a = "1";
String b = a;
a = "2";
System.out.println("b = "+b);
changeString(a);
System.out.println("a = "+a);
}
public static void testArray() {
int[] a = {1,2,3};
int[] b = a;
a[0] = 2;
System.out.println("b[0] = "+b[0]);
changeArray(a);
System.out.println("a[0] = "+a[0]);
}
public static void testX() {
X a = new X("1");
X b = a;
a.setValue("2");
System.out.println("b.value = "+b.getValue());
changeX(a);
System.out.println("a.value = "+a.getValue());
}
static void changeInt(int a) { a = 100;}
static void changeString(String a) { a = "100";}
static void changeArray(int[] a) { a[0] = 100;}
static void changeX(X a) { a.setValue("100");}
輸出結果補充,如下:
b = 1
a = 2
b = 1
a = 2
b[0] = 2
a[0] = 100
b.value = 2
a.value = 100
結果分析:
將數據賦值或當做參數傳遞的時候:
1,對於基本數據類型,String類, Integer, Double等immutable的類型 都是 值傳遞;
2,對於數組,其他類等,都是引用傳遞;
圖形表達:
//2018-9-17更新
如果非要談論是否java里只有值傳遞,可以把引用傳遞看成:實際上傳遞了引用的值。
補充代碼與輸出如下
public static void testX02() {
X a = new X("1");
changeX02(a);
System.out.println("a.value = "+a.getValue());
}
static void changeX02(X a) {
a = new X("");
a.setValue("100");
}
上方代碼輸出結果:a.value = 1
也就是說testX02中的a,仍然指向最初定義value為“1”的對象;
當做參數調用changeX02后,只能通過引用去改變對象,不能去改變其指向對象;
所以傳遞的是引用的復制,也就是上圖中的黃色箭頭。