2017-05-07 95 views
1

這GIF從https://blog.penjee.com/passing-by-value-vs-by-reference-java-graphical/如果Java是按值傳遞的,那麼爲什麼我們可以改變方法中對象的屬性?

An animation depicting pass-by-value vs pass-by-references

也許我非常誤解這個檢索,但請多多包涵。

根據我的理解,當我們在java中定義一個變量時,我們本質上是創建一個指向創建的對象的指針。即

Object objPointer = new Object(); 

這裏objPointer是對創建的對象的引用,而不是對象本身。而當我們的方法使用該對象作爲參數:

void foo(Object newPointer){ 
    //newPointer points to a copy of the Object objPointer pointed to. 
} 

foo(objPointer); 

正式的說法newPointer是指針,作爲參數傳遞的對象的值的副本。這就是爲什麼swap方法在java中不起作用。

但我的問題是這樣的: 如果形式參數只指向原始對象的副本,那麼爲什麼我們可以更改該對象的屬性的值?即

class Object{ 
    int var = 0; //default value of 0 
    void setVar(int newValue){ 
     this.var = newValue; 
    } 
} 

void foo(Object newPointer){ 
    newPointer.setVar(1); 
} 

Object objPointer = new Object(); 
//The Object objPointer points to has a var value of 0 as default. 

foo(objPointer); 

/* 
     After foo is called, the var value of objPointer has changed to 1 
    although the setVar method should only change the value of var for the copy 
    of that object that newPointer points to. 
*/ 

我希望我要問是有道理的,我發現那種的GIF說明我在說什麼:如何是杯形物的性質改變了,如果fillCup只改變了副本的屬性?

+1

複製是值,它是指向同一引用的指針(即不存在兩個實例)。 –

+2

「指針」是要傳遞的值。堆上仍然只有一個「Object」實例,但是在堆棧中有一個「指針」的副本。 – David

+1

指針被複制,但兩個指針都指向同一個對象。 –

回答

2

在您通過objPointer參考foo的方法,該方法foo獲得對象參考的副本,通過這個參考,它可以訪問或突變的參數對象。但是,如果更改參數引用的對象即新對象,則這將影響而不是影響最初傳入的初始對象。

0

您正在傳遞仍指向參考的副本內存中的相同對象。你沒有通過new object。您正在傳遞對您在以下行創建的objPointer的引用:Object objPointer = new Object();

相關問題