標籤:傳值 alt comment 執行個體 term 結果 http eval string
優秀部落格轉寄自:http://blog.csdn.net/zgz0627/article/details/50180971
java中只有值傳遞,不存在引用傳遞。無論是傳值還是傳地址都屬於值傳遞。注意傳地址並不是引用傳遞。
一、傳值
1.程式碼範例:
- public class ValuePropagation
- {
- static void changeValue(int value)
- {
- value += 10;
- }
-
- public static void main(String[] args)
- {
- int num = 10;
- //未執行changeValue方法前num的值
- System.out.println(num);
- changeValue(num);
- //執行changeValue方法後num的值
- System.out.println(num);
- }
- }
2.結果:兩次輸出的結果是一樣的,都是10並沒有改變。
3.圖解:
4.分析:num作為參數傳遞給changeValue(int value)方法時,是將記憶體空間中num所指向的那個記憶體單元中的值傳遞給changeValue(int value)中的參數value變數,而value這個變數也在記憶體空間中被分配的一個記憶體單元,changeValue(int value)中所有的操作都是對value所指向的那個記憶體單元的值進行操作,與num所指的那個記憶體單元不再有任何關係,所以兩次輸出的num值是一樣的。
二、傳地址
執行個體對象作為參數傳遞時,傳遞的是對象引用的副本,傳的是地址值,現在該對象有兩個引用都指向她,對象的內容可以在調用過程中被改變,但是對象的引用始終沒有改變,對象引用為傳遞參數,引用沒有改變,很明顯這是值傳遞。
1.程式碼範例:
- class Person
- {
- public static String name = "Tom";
- }
-
- public class TransmitAdress
- {
- static void changeName(Person p)
- {
- p.name = "Jerry";
- }
-
- public static void main(String[] args)
- {
- Person person = new Person();
-
- //未執行changeName(Person p)前
- System.out.println(person.name);
-
- changeName(person);
-
- //執行changeName(Person p)後
- System.out.println(person.name);
- }
- }
2.結果:第一次輸出的是Tom,第二次輸出的Jerry。面對這樣的結果,很多人很容易認為這是引用傳遞,通過下面的圖解和分析你就會明白這也是值傳遞。
3.圖解:
4.分析:主函數new了一個person對象,實際上分配了兩個記憶體空間:一個在堆記憶體中,用來存放建立Person類的對象實體,一個在棧記憶體中,用來存放指向對象的引用變數person。0x345~0x348這段堆記憶體存放的是對象的實體,0x345是實體物件的首地址,而person所指向的棧記憶體中存放的值正是0x345,是實體物件的首地址,也就是說,person指向實體物件。當person作為參數傳遞給changeName(Person p)方法時,是將棧記憶體中person所指向的記憶體單元中存放的值複製給了參數p,也就是實體物件的地址傳給了p,而參數p在棧記憶體中已經被分配了一個記憶體單元,changeName(Person p)中所有的操作都是對p所指的記憶體單元進行操作,與person所指向的記憶體單元沒有關係了。所以說,這是值傳遞,而不是引用傳遞。
java值傳遞和引用傳遞