2017-05-07 72 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();

相关问题