【java】的傳值方式
【java】的傳值方式
當你問大多數程序員Java是傳值還是傳引用的時候,你可能會得到兩種答案之一:
(1)Java傳遞原始類型數據時使用的是傳值方式;傳遞對象時則使用傳引用方式;String類型的數據采用的是傳值方式,因為字符串是不可變的。(2)Java傳遞所有參數都使用傳值方式。
只有第二個答案是正確的。理解傳值和傳引用的區別的關鍵是要記住,當你向一個方法傳遞一個對象時,Java沒有把對象放入堆棧,它只是拷貝對象的引用然後將這個引用的拷貝放入堆棧。也就是說,根據定義,Java使用的是傳值方式。
證明
如果Java通過傳引用方式傳遞對象,那麽執行下面的代碼就會交換保存在兩個變量a和b中的引用,而相應的輸出應該如下:
a: 4
b: 100
Swapped!
a: 100
b: 4
其實真正的動作是在方法的參數o1和o2中的引用,它並不影響原始變量a和b。下面是其實際輸出:
a: 4
b: 100
Swapped!
a: 4
b: 100
public class SwapTip { public static void main(String []args) { Integer a = new Integer(4); Integer b = new Integer(100); System.out.println("a: " + a); System.out.println("b: " + b); swap(a, b); System.out.println("Swapped!"); System.out.println("a: " + a); System.out.println("b: " + b); } public static void swap(Object o1, Object o2) { Object t = o1; o1 = o2; o2 = t; } }
為什麽說這個爭論的答案是有意義的?
對於有經驗的程序員來說這可能是一個語義問題,但是對於那麽沒有什麽經驗的程序員來說,情況就不一樣了。對於程序員來說一個語言的黑拿越少,他們在用那種語言寫程序的時候就能做得越好。
一個類比
對象引用與實例的關系就像遙控器與電視機的關系,引用控制對象就像遙控器控制電視機一樣。如果一個遙控器的復制品給了另一個人,那麽那個人也可以控制電視機。復制的遙控器對電視機的動作(比如說調節音量、改換頻道或者調節時鐘)對於它本身和原裝遙控器來說都是可見的。如果那個人改裝了復制的遙控器去控制另外一臺電視機,那麽原來的遙控器不會受到影響。
誠然,Java是通過傳值還是傳引用的方式來傳遞參數只是一個學術上的區別,只要我們知道期望哪種行為即可。但是有時候知道臺後的事情也是重要的。
Java只有一種參數傳遞方式,那就是傳值。它簡單、有文檔可查並且確實是如此。
轉自http://www.blogjava.net/zsh118/articles/24564.html
public class Test { public static void main(String[] args) { StringBuffer a = new StringBuffer("A"); StringBuffer b = new StringBuffer("B"); int i = 5;
System.out.println(a + "," + b + "," + i); operate(a, b, i); System.out.println(a + "," + b + "," + i); } public static void operate(StringBuffer x, StringBuffer y, int j) { x.append(y); y = x; y.append("C"); j = 1; } }
運行結果:
A,B,5
ABC,B,5
【java】的傳值方式