Java 值傳遞的終極解釋

對於Java的值傳遞, 你真的瞭解麼? Java裏面只有值傳遞, 這個值是什麼? 如果是基本數據類型。 你也許回答的很乾脆。 但如果是Object對象呢? 你確定清楚不? 先看下code。


package com.basic;

public class Test {

/**
* @param args
*/
public static void main(String[] args) {
StringBuffer buffer= new StringBuffer("colin");
SChange(buffer);
System.out.println( buffer);
}

public static void SChange (StringBuffer str) {
str= new StringBuffer("huang");
}

}

上面code, 輸出的結果是什麼? 你對了嗎?

輸出的結果是 colin.

我們修改下code

package com.basic;

public class Test {

/**
* @param args
*/
public static void main(String[] args) {
StringBuffer buffer= new StringBuffer("colin");
SChange(buffer);
System.out.println( buffer);
}

public static void SChange (StringBuffer str) {
//str= new StringBuffer("huang");
str.append(" huang");
}

}



輸出的結果是 colin huang.

爲什麼是這樣的結果呢? 下面詳細解釋:

Java確實通過引用來維護Object, 所有的Object變量, 都是一個引用。但Java在方法傳遞中, 確實是值傳遞。 那這個值是什麼呢。 對於Object, 這個值就是傳人的Object的引用。既把這個引用copy了一份。 那麼, 就至少有兩個引用指向了這同一個傳入的Object。 參考下圖:
[img]http://dl.iteye.com/upload/attachment/442344/396980e3-0fcd-3911-b8c2-b7bf79820d15.jpg[/img]

那麼, 我們就來圖解下上面的那兩個代碼。

下圖圖解代碼一
[img]http://dl.iteye.com/upload/attachment/442346/22c44061-f3f8-3e27-b747-995f60dea39e.jpg[/img]

接着圖解代碼二
[img]http://dl.iteye.com/upload/attachment/442348/2de12975-87ff-3838-959e-c9da025f51cf.jpg[/img]

代碼一中, copy的那個引用, 指向了一個新的對象。 但原對象還是沒有變化的。
代碼二中, copy的那個引用, 把原對象改變了。


這就是Java的值傳遞。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章