这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
指针被复制,但两个指针都指向同一个对象。 –