2017-05-07 5 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は、引数として渡されたオブジェクトの値のコピーへのポインタです。このため、Javaではスワップメソッドが機能しません。

私の質問は次のとおりです。 仮引数が元のオブジェクトのコピーのみを指している場合、そのオブジェクトのプロパティの値を変更できるのはなぜですか?変更fillCupはコピーのみのプロパティを変更した場合どのようにカップオブジェクトのプロパティは、以下のとおりです。すなわち

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は、私が言っているものを示して、私が求めている何が理にかなって願っています?あなたはfoo方法をobjPointerの参照を渡すと

+1

コピーは、同一の参照(すなわち、2つのインスタンスが存在しない)へのポインタである値です。 –

+2

"ポインタ"は渡される値です。ヒープには 'Object'のインスタンスがまだ1つしかありませんが、スタックに"ポインタ "のコピーがあります。 – David

+1

ポインタはコピーされますが、両方のポインタが同じオブジェクトを指しています。 –

答えて

2

は、foo方法は、この参照を通じて、オブジェクト参照のコピーを取得し、それがアクセスしたり、パラメータオブジェクトを変異させることができます。しかし、パラメータが参照するオブジェクト、つまり新しいオブジェクトを変更した場合、ではなく、が最初に渡された初期オブジェクトに影響します。

0

参照先のコピーを渡しています。メモリ内の同じオブジェクト。あなたはnew objectを渡していません。あなたが行で作成したobjPointerへの参照を渡している。Object objPointer = new Object();

関連する問題