Stackoverflow問答:Java是傳值還是傳引用?
阿新 • • 發佈:2018-12-22
原文地址 譯者:葉文海([email protected])
譯者注:這是一篇在Stackoverflow上面的一個經典問題,也是Java開發者容易混淆的一個問題,我節選了其中兩個vote最高的回覆進行翻譯。
問題:我一直認為Java的引數是按引用傳遞,然而我看過一些文章裡說Java的引數並不是按引用傳遞的,比如這篇,這讓我很迷惑。Java中的引數到底是按引用傳遞還是按值傳遞?
回答1:
在Java裡引數是按值來傳遞的。比較難理解的可能是Java傳遞的是物件的引用,但這些引用是按值傳遞。
比如:
public static void main( String[] args ){ Dog aDog = new Dog("Max"); foo(aDog); if( aDog.getName().equals("Max") ){ //true System.out.println( "Java passes by value." ); }else if( aDog.getName().equals("Fifi") ){ System.out.println( "Java passes by reference." ); } } public static void foo(Dog d) { d.getName().equals("Max"); // true d = new Dog("Fifi"); d.getName().equals("Fifi"); // true }
在這個例子裡面,執行完foo()方法之後,在main方法裡再呼叫aDog.getName()方法依然會返回”Max”,在main方法中的
aDog並沒有因為foo()的執行而被重寫,這說明了引數是按值來進行傳遞的。如果是按照引用來傳遞的話在執行完foo()
方法之後aDog.getName()將會返回”Fifi”。
就像這樣:
Dog aDog = new Dog("Max"); foo(aDog); aDog.getName().equals("Fifi"); // true public void foo(Dog d) { d.getName().equals("Max"); // true d.setName("Fifi"); }
回答2:
我剛剛發現你引用了我的文章