1. 程式人生 > >Javaの值傳遞和引用傳遞

Javaの值傳遞和引用傳遞

引用傳遞和值傳遞
java中是沒有指標的,java中只存在值傳遞,只存在值傳遞,只存在值傳遞!!! 然而我們經常看到對於物件(陣列,類,介面)的傳遞似乎有點像引用傳遞,可以改變物件中某個屬性的值。但是不要被這個假象所矇蔽,實際上這個傳入函式的值是物件引用的拷貝,即傳遞的是引用的地址值,所以還是按值傳遞。

這裡要用實際引數和形式引數的概念來幫助理解,

1.值傳遞:

方法呼叫時,實際引數把它的值傳遞給對應的形式引數,函式接收的是原始值的一個copy,此時記憶體中存在兩個相等的基本型別,即實際引數和形式引數,後面方法中的操作都是對形參這個值的修改,不影響實際引數的值。

public class
Test3 { public static void change(int a){ a=50; } public static void main(String[] args) { int a=10; System.out.println(a); change(a); System.out.println(a); } }

輸出的 是10,10。傳遞的是值得一份拷貝,這份拷貝與原來的值沒什麼關係。

2.引用傳遞:

也稱為傳地址。方法呼叫時,實際引數的引用(地址,而不是引數的值)被傳遞給方法中相對應的形式引數,函式接收的是原始值的記憶體地址;
在方法執行中,形參和實參內容相同,指向同一塊記憶體地址,方法執行中對引用的操作將會影響到實際物件

public class Test3 {
    public static void change(int []a){
        a[0]=50;
    }
    public static void main(String[] args) {
        int[] a={10,20};
        System.out.println(a[0]);
        change(a);
        System.out.println(a[0]);
    }
}

輸出結果為10 50。實際傳遞的是引用的地址值。

再看一個例子

class Emp {
    public
int age; } public class Test { public static void change(Emp emp) { emp.age = 1000; emp = new Emp();//再建立一個物件 emp.age=10000; } public static void main(String[] args) { Emp emp = new Emp(); emp.age = 10; System.out.println(emp.age); change(emp); System.out.println(emp.age); System.out.println(emp.age); } }

輸出10 1000 1000
這裡寫圖片描述

總結
(1)基本資料型別傳值,對形參的修改不會影響實參;
(2)String, Integer, Double等immutable的型別特殊處理,可以理解為傳值,最後的操作不會修改實參物件。
(3)引用型別傳引用,形參和實參指向同一個記憶體地址(同一個物件),所以對引數的修改會影響到實際的物件;