JAVA中方法的參數傳遞(轉)


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) : 在參數傳遞的過程中,形參和實參完全是同一塊內存空間,兩者不分彼此。 實際上,形參名和實參名只是編程中的不同符號,在程序運行過程中,內存中存儲的空間才是最重要的。不同的變量名並不能說明占用的內存存儲空間不同。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM