1. 程式人生 > >Stackoverflow問答:Java是傳值還是傳引用?

Stackoverflow問答:Java是傳值還是傳引用?

譯者注:這是一篇在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:

我剛剛發現你引用了我的文章