經常看到有人說什么值傳遞、參考傳遞,其實都是值傳遞,區別不過是傳的值的型別罷了,
傳值方式
java傳值有且只有一種方式,將引數的“值”復制后傳入,這個“值”是指變數名所對應的地址中存放的值,對于值型別和物件型別,由于地址中存放的東西不同,因此表現有所不同:
- 對于8種值型別,其存放的就是本身的值,因此表現為將值傳遞到函式中,修改后的值對原值無影響,
- 對于物件來說,其存放的是物件頭,里面包含了物件的型別、首地址等,將物件頭的值傳遞到函式中,其仍然能正確指向物件本身,
傳遞的是值的拷貝,而非其本身
值型別
對于值型別來說
7++;
這種無疑是錯誤的,因為不能對常量進行修改,任何一個IDE都會報錯,

但如果將其作為引數傳入
public class ObjTest {
public static void main(String[] args) {
inc(7);
}
private static void inc(int a) {
a++;
System.out.println(a);
}
}
那么就不會報錯,并且輸出8,這是因為在傳遞到函式里面的并不是常量7,而是一個拷貝int a = 7,而a是一個int型別的變數,因此可以自增,
物件
而對于物件來說,同樣如此,
public class ObjTest {
public static void main(String[] args) {
inc(7);
Node n1 = new Node();
f1(n1);
System.out.println("n1 = " + n1);
}
private static void f1(Node node) {
node.a++;
node.b += 2;
node.c += 3;
node.d = new int[]{1, 5};
// 在此設定斷點2
node = new Node();
node.a = -1;
node.b = -2;
node.d[0] = 3;
System.out.println("node = " + node);
}
private static void inc(int a) {
a++;
System.out.println(a);
}
}
public class Node {
public int a;
public int b;
public int c;
public int[] d = new int[2];
}
在執行到斷點1的時候,如下圖所示,可以看到,n1的所有值都為默認值,地址為0x704

在執行到斷點2(此行未執行)時,如下圖所示,可以看到,node指向的地址仍為@704,值已經進行了對應的修改

繼續執行到函式結束,可以看到node指向了@708,屬性的值變為了新的值,

結束子函式,回到主函式中,可以看到n1的所有屬性都與node指向@704時相同

可見,同值型別的變數相同,傳入子函式的物件頭node并不是主函式中的物件頭n1本身,而是它的一個拷貝,他們指向同一個物件@704,無論是通過n1,還是初始的node,都可以對@704進行操作(呼叫方法,修改屬性),因而好像和值型別的傳遞有所不同,但如果修改node本身的值,令其指向@708,這對n1沒有任何影響,n1依然指向@704,此后通過node修改物件的值,修改的是@708的值,與@704沒有任何關系,因此也對主函式中的n1沒有任何影響,
因此,所謂參考傳遞,不過是值是參考(或者說指標)的值傳遞,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/469469.html
標籤:Java
上一篇:創建執行緒池的方式
