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

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

原文地址 譯者:葉文海([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:

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