一、基本類型和引用類型的理解
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的類型特殊處理,可以理解爲傳值,最後的操作不會修改實參對象。