1. 程式人生 > >Java中值傳遞和引用傳遞的理解

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

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

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.結論

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

  1. 基本資料型別傳值,對形參的修改不會影響實參;
  2. 引用型別傳引用,形參和實參指向同一個記憶體地址(同一個物件),所以對引數的修改會影響到實際的物件。
  3. String, Integer, Double等immutable的型別特殊處理,可以理解為傳值,最後的操作不會修改實參物件。