分析Java是"按引用傳遞"還是"按值傳遞"

我一直認為Java使用傳遞引用。

但是,我看過幾篇博客文章,聲稱不是(博客文章中說Java使用值傳遞)。

我不認為我能理解他們的區別。

有什麼解釋?

解決方案

Java總是按值傳遞。
不幸的是,我們根本不處理任何對象,而是處理稱為引用(當然是通過值傳遞)的對象句柄。選擇的術語和語義很容易使許多初學者感到困惑。

它是這樣的:

public static void main(String[] args) {
    Dog aDog = new Dog("Max");
    Dog oldDog = aDog;

    // we pass the object to foo
    foo(aDog);
    // aDog variable is still pointing to the "Max" dog when foo(...) returns
    aDog.getName().equals("Max"); // true
    aDog.getName().equals("Fifi"); // false
    aDog == oldDog; // true
}

public static void foo(Dog d) {
    d.getName().equals("Max"); // true
    // change d inside of foo() to point to a new Dog instance "Fifi"
    d = new Dog("Fifi");
    d.getName().equals("Fifi"); // true
}

在上面的示例中aDog.getName()仍然會返回"Max"。值aDogmain未在功能改變fooDog"Fifi"作為對象基準由值來傳遞。如果是通過引用傳遞的,則aDog.getName()inmain"Fifi"在調用之後返回foo

同樣地:

public static void main(String[] args) {
    Dog aDog = new Dog("Max");
    Dog oldDog = aDog;

    foo(aDog);
    // when foo(...) returns, the name of the dog has been changed to "Fifi"
    aDog.getName().equals("Fifi"); // true
    // but it is still the same dog:
    aDog == oldDog; // true
}

public static void foo(Dog d) {
    d.getName().equals("Max"); // true
    // this changes the name of d to be "Fifi"
    d.setName("Fifi");
}

在上面的示例中,Fifi是調用後的狗的名字,foo(aDog)因為該對象的名稱設置在中foo(...)。任何操作是foo執行上d是這樣的,對於所有的實際目的,它們被執行的aDog,但它是不是可以改變變量的值aDog本身。

到此這篇關於分析Java是”按引用傳遞”還是”按值傳遞”的文章就介紹到這瞭,更多相關java引用傳遞值傳遞內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀:

    None Found