【Java】java中的值傳遞和引用傳遞

面試題:當一個對象被當作參數傳遞到一個方法後,此方法可改變這個對象的屬性,並可返回變化後的結果,那麼這裏到底是值傳遞還是引用傳遞?

   答:是值傳遞。Java編程語言只有值傳遞參數。當一個對象實例作爲一個參數被傳遞到方法中時,參數的值就是該對象的引用一個副本。指向同一個對象,對象的內容可以在被調用的方法中改變,但對象的引用(不是引用的副本)是永遠不會改變的。


在 Java應用程序中永遠不會傳遞對象,而只傳遞對象引用。因此是按引用傳遞對象。但重要的是要區分參數是如何傳遞的,這纔是該節選的意圖。Java應用程序按引用傳遞對象這一事實並不意味着 Java 應用程序按引用傳遞參數。參數可以是對象引用,而 Java應用程序是按值傳遞對象引用的。
  
Java應用程序中的變量可以爲以下兩種類型之一:引用類型或基本類型。當作爲參數傳遞給一個方法時,處理這兩種類型的方式是相同的。兩種類型都是按值傳遞的;沒有一種按引用傳遞。
   
按值傳遞意味着當將一個參數傳遞給一個函數時,函數接收的是原始值的一個副本。因此,如果函數修改了該參數,僅改變副本,而原始值保持不變。按引用傳遞意味着當將一個參數傳遞給一個函數時,函數接收的是原始值的內存地址,而不是值的副本。因此,如果函數修改了該參數的值,調用代碼中的原始值也隨之改變。如果函數修改了該參數的地址,調用代碼中的原始值不會改變.
   
當傳遞給函數的參數不是引用時,傳遞的都是該值的一個副本(按值傳遞)。區別在於引用。在 C++中當傳遞給函數的參數是引用時,您傳遞的就是這個引用,或者內存地址(按引用傳遞)。在 Java應用程序中,當對象引用是傳遞給方法的一個參數時,您傳遞的是該引用的一個副本(按值傳遞),而不是引用本身。
   
Java 應用程序按值傳遞參數(引用類型或基本類型),其實都是傳遞他們的一份拷貝.而不是數據本身.(不是像 C++中那樣對原始值進行操作。)


例1

//在函數中傳遞基本數據類型,   
public   class  Test {   
            
     public   static   void  change( int  i,  int  j) {   
         int  temp = i;   
        i = j;   
        j = temp;   
    }   
  
     public   static   void  main(String[] args) {   
         int  a =  3 ;   
         int  b =  4 ;   
        change(a, b);   
  
        System.out.println( "a="  + a);   
        System.out.println( "b="  + b);   
    }   
}    

結果爲:   a=3  b=4

原因就是 參數中傳遞的是 基本類型 a 和 b 的拷貝,在函數中交換的也是那份拷貝的值 而不是數據本身;


例2:

//傳的是引用數據類型   
public   class  Test {   
  
     public   static   void  change( int [] counts) {   
        counts[ 0 ] =  6 ;   
        System.out.println(counts[ 0 ]);   
    }   
  
     public   static   void  main(String[] args) {   
         int [] count = {  1 ,  2 ,  3 ,  4 ,  5  };   
        change(count);   
    }   
}    <span>  
</span>
6
original : 6

在方法中 傳遞引用數據類型int數組,實際上傳遞的是其引用count的拷貝,他們都指向數組對象,在方法中可以改變數組對象的內容。即:對複製的引用所調用的方法更改的是同一個對象。


例3:

//對象的引用(不是引用的副本)是永遠不會改變的   
class  A {   
     int  i =  0 ;   
}   
  
  
public   class  Test {   
  
     public   static   void  add(A a) {   
        a =  new  A();   
        a.i++;   
    }   
       
     public   static   void  main(String args[]) {   
        A a =  new  A();   
        add(a);   
        System.out.println(a.i);   
    }   
}    
    輸出結果是 0   
    在該程序中,對象的引用指向的是A ,而在change方法中,傳遞的引用的一份副本則指向了一個新的OBJECT,並對其進行操作。   
    而原來的A對象並沒有發生任何變化。 引用指向的是還是原來的A對象。  





發佈了65 篇原創文章 · 獲贊 26 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章