分析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"
。值aDog
內main
未在功能改變foo
與Dog
"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