Java中值傳遞和引用傳遞的理解
阿新 • • 發佈:2018-12-31
一、基本型別和引用型別的理解
Java中的資料型別分為兩種為基本型別和引用型別。
1、基本型別的變數儲存原始值,所以變數就是資料本身。
常見的基本型別:byte,short,int,long,char,float,double,Boolean,returnAddress。
2、引用型別的變數儲存引用值,所謂的引用值就是物件所在記憶體空間的“首地址值”,通過對這個引用值來操作物件。
常見的引用型別:類型別,介面型別和陣列。
二、值傳遞和引用傳遞的理解
1、值傳遞
在方法的呼叫過程中,實參把它的實際值傳遞給形參,此傳遞過程就是將實參的值複製一份傳遞到函式中,這樣如果在函式中對該值(形參的值)進行了操作將不會影響實參的值 。因為是直接複製,所以這種方式在傳遞大量資料時,執行效率會特別低下。
2、引用傳遞
引用傳遞彌補了值傳遞的不足,如果傳遞的資料量很大,直接復過去的話,會佔用大量的記憶體空間,而引用傳遞就是將物件的地址值傳遞過去,函式接收的是原始值的首地址值。在方法的執行過程中,形參和實參的內容相同,指向同一塊記憶體地址,也就是說操作的其實都是源資料,所以方法的執行將會影響到實際物件。
舉例說明:
public class Example { String str = new String("hello"); char[] ch = {'a', 'b'}; public static void main(String[] args) { Example ex = new Example(); ex.change(ex.str, ex.ch); System.out.println(ex.str + " and"); System.out.println(ex.ch); } public void change(String str, char[] ch) { str = "ok"; ch[0] = 'c'; } }
輸出是:
hello and
cb
過程分析:
1、為物件分配空間
2、執行change()方法
執行前實參(黑色)和形參(紅色)的指向如下:
因為String是不可變類且為值傳遞,而ch[]是引用傳遞,所以方法中的str = "ok",相當於重新建立一個物件並沒有改變實參str的值,陣列是引用傳遞,直接改變,所以執行完方法後,指向關係如下:
3.結論
通過上面的分析我們可以得出以下結論:
- 基本資料型別傳值,對形參的修改不會影響實參;
- 引用型別傳引用,形參和實參指向同一個記憶體地址(同一個物件),所以對引數的修改會影響到實際的物件。
- String, Integer, Double等immutable的型別特殊處理,可以理解為傳值,最後的操作不會修改實參物件。