這GIF從https://blog.penjee.com/passing-by-value-vs-by-reference-java-graphical/如果Java是按值傳遞的,那麼爲什麼我們可以改變方法中對象的屬性?
也許我非常誤解這個檢索,但請多多包涵。
根據我的理解,當我們在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只改變了副本的屬性?
複製是值,它是指向同一引用的指針(即不存在兩個實例)。 –
「指針」是要傳遞的值。堆上仍然只有一個「Object」實例,但是在堆棧中有一個「指針」的副本。 – David
指針被複制,但兩個指針都指向同一個對象。 –