java方法參數傳遞小結:
基礎數據類型(int,char,……)傳值,對象類型(Object,數組,容器……)傳引用。
有說java方法參數都是傳值的,理解方式不同而已。引用本身也是值(對象地址)。
傳值方式,傳遞的是值的副本。方法中對副本的修改,不會影響到調用方。
傳引用方式,傳遞的是引用的副本。此時,形參和實參指向同一個內存地址。對引用副本所指向的對象的修改,如修改對象屬性、容器內容等,會影響到調用方。對引用副本本身(對象地址)的修改,如設置為null,重新指向其他對象,不會影響到調用方。
只要知道傳引用時,也是傳遞的引用的副本,就比較容易理解了。
我們首先用一段代碼來證實一下為什么Java的對象參數傳遞 是值調用。
public class Employee {
public String name=null;
public Employee(String n){
this.name=n;
}
//將兩個Employee對象交換
public static void swap(Employee e1,Employee e2){
Employee temp=e1;
e1=e2;
e2=temp;
System.out.println(e1.name+" "+e2.name); //打印結果:李四 張三
}
//主函數
public static void main(String[] args) {
Employee worker=new Employee("張三");
Employee manager=new Employee("李四");
swap(worker,manager);
System.out.println(worker.name+" "+manager.name); //打印結果仍然是: 張三 李四
}
}
上面的結果讓人很失望,雖然形參對象e1,e2的內容交換了,但實參對象worker,manager並沒有互換內容。這里面最重要的原因就在於形參e1,e2是實參worker,manager的地址拷貝。
大家都知道,在Java中對象變量名實際上代表的是對象在堆中的地址(專業術語叫做對象引用 )。在Java方法調用的時候,參數傳遞的是對象的引用。重要的是,形參和實參所占的內存地址並不一樣,形參中的內容只是實參中存儲的對象引用的一份拷貝。
Java對象參數傳遞雖然傳遞的是地址(引用),但仍然是值調用。是時候需要給引用調用和值調用一個准確的定義了。
值調用(call by value) : 在參數傳遞過程中,形參和實參占用了兩個完全不同的內存空間。形參所存儲的內容是實參存儲內容的一份拷貝。實際上,Java對象的傳遞就符合這個定義,只 不過形參和實參所儲存的內容並不是常規意義上的變量值,而是變量的地址。咳,回過頭想想:變量的地址不也是一種值嗎!
引用調用(call by reference) : 在參數傳遞的過程中,形參和實參完全是同一塊內存空間,兩者不分彼此。 實際上,形參名和實參名只是編程中的不同符號,在程序運行過程中,內存中存儲的空間才是最重要的。不同的變量名並不能說明占用的內存存儲空間不同。