0

オブジェクトのインスタンスがあり、そのオブジェクト内に別のオブジェクトのデータを保持する変数があるとします。2 番目のオブジェクトを更新すると、そのオブジェクトのコピーも更新されるか、またはそのオブジェクトのすべてのコピーを同時に更新する必要があります。

例えば:

public class Object()
{
    int x = xValue;
    Object linked = saidObject;
}

public class doStuff()
{
   saidObject.x++;
   if(linked.equals(saidObject))
       return true;
}

このコード (コンパイルできず、明らかに空白を埋めるだけ) は true を返しますか?

4

3 に答える 3

1

if(linked.equals(saidObject))2 つの変数が同じオブジェクトを指しているため、true が返されます。

Java では、すべての変数とフィールドは、メモリ内のどこかに存在する実際のオブジェクトへの参照です。

ある変数を別の変数に代入することは、オブジェクトのアドレスをコピーして、両方がメモリ内の同じオブジェクトを指すようにするようなものです。

例えば

Object a = new Object();  // this actually creates the Object in memory
Object b = a;             // this copies the reference to Object from a to b
// At this point, a and b point to exactly the same object in memory. Therefore ...
a.equals(b);              // returns true.

実際a == bには true も返します。これは、==2 つの変数が同じオブジェクトを指している場合に比較する (そうです)ため、この場合の比較のより良い方法ですequals()が、値で比較することがよくありますが、ここでは不要です。

bが実際に 内のフィールドa(例: ) であり、同じタイプのオブジェクトを指しているかどうかは問題ではありませんclass Obj { Obj b; }; Obj a = new Obj(); a.b = a;。原則は同じですa = b。同じオブジェクトを指していることを意味し、新しいものは何も作成されません。

于 2013-11-07T03:23:46.420 に答える
1

行うことによって:

Object linked = saidObject;

オブジェクトをコピーするのではなく、オブジェクトへの別のポインターを作成するだけです。つまり、同じオブジェクトを指す2つの異なるポインターがあることを意味します。

オブジェクトのコピーまたはクローン作成が役立つ場合もありますが、通常はそうではありません。

于 2013-11-07T03:22:25.763 に答える
0

オブジェクト インスタンスはそれ自体であり、他のすべてのインスタンスとは異なります。

つまり、(フィールドを再割り当てすることによって) オブジェクトをどこかで変更すると、どこでもそれが変更されます..まあ、それが何であるかです。同様に、のオブジェクトを変更することは、別のオブジェクトを変更することです。

于 2013-11-07T03:14:14.780 に答える