Java中值傳遞和引用傳遞的理解

 

一、基本類型和引用類型的理解

Java中的數據類型分爲兩種爲基本類型和引用類型。

1、基本類型的變量保存原始值,所以變量就是數據本身。

    常見的基本類型:byte,short,int,long,char,float,double,Boolean,returnAddress。

2、引用類型的變量保存引用值,所謂的引用值就是對象所在內存空間的“首地址值”,通過對這個引用值來操作對象。

    常見的引用類型:類類型,接口類型和數組

二、值傳遞和引用傳遞的理解

1、值傳遞

    在方法的調用過程中,實參把它的實際值傳遞給形參,此傳遞過程就是將實參的值複製一份傳遞到函數中,這樣如果在函數中對該值(形參的值)進行了操作將不會影響實參的值。因爲是直接複製,所以這種方式在傳遞大量數據時,運行效率會特別低下。

2、引用傳遞

    引用傳遞彌補了值傳遞的不足,如果傳遞的數據量很大,直接復過去的話,會佔用大量的內存空間,而引用傳遞就是將對象的地址值傳遞過去,函數接收的是原始值的首地址值。在方法的執行過程中,形參和實參的內容相同,指向同一塊內存地址,也就是說操作的其實都是源數據,所以方法的執行將會影響到實際對象

舉例說明:


 
  1. public class Example {

  2. String str = new String("hello");

  3. char[] ch = {'a', 'b'};

  4. public static void main(String[] args) {

  5. Example ex = new Example();

  6. ex.change(ex.str, ex.ch);

  7. System.out.println(ex.str + " and");

  8. System.out.println(ex.ch);

  9. }

  10.  
  11. public void change(String str, char[] ch) {

  12. str = "ok";

  13. ch[0] = 'c';

  14. }

  15. }

輸出是:

hello and

cb

過程分析:

1、爲對象分配空間

2、執行change()方法

執行前實參(黑色)和形參(紅色)的指向如下:

因爲String是不可變類且爲值傳遞,而ch[]是引用傳遞,所以方法中的str = "ok",相當於重新創建一個對象並沒有改變實參str的值,數組是引用傳遞,直接改變,所以執行完方法後,指向關係如下:

3.結論

通過上面的分析我們可以得出以下結論:

  1. 基本數據類型傳值,對形參的修改不會影響實參;
  2. 引用類型傳引用,形參和實參指向同一個內存地址(同一個對象),所以對參數的修改會影響到實際的對象。
  3. String, Integer, Double等immutable的類型特殊處理,可以理解爲傳值,最後的操作不會修改實參對象。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章