1

私は現在 Android アプリを作成していて、データの内部保存などに問題があると思っていました。問題はそれとは関係なく、Java の理解に問題があることが判明しました。

問題は、私がするときです

myObject1 = myObject2;

リスト、または何でも(私の場合はHashtable)を使用myObject1してから change もそれに応じて変更されます。これは何と呼ばれ、どこで詳しく知ることができますか? 完全に「独立」するように割り当てるにはどうすればよいですか?myObject3myObject2myObject3myObject2myObject1myObject1

4

6 に答える 6

5

Java のオブジェクトである変数は参照と呼ばれ、メモリ内の同じ場所を参照します。メモリ内の同じ場所を参照しない同じタイプの 2 つのオブジェクトが必要な場合は、キーワードを使用してマシンにメモリを割り当てる必要があります。new

myObject1 と myObject2 の両方の変数の下には、OBJECT1 オブジェクトへの参照がありますが、同じメモリ位置には存在しません。

OBJECT1 myObject1 = new OBJECT1();
OBJECT1 myObject2 = new OBJECT1();

オブジェクトを別のオブジェクトに割り当てることが重要な場合は、clone()メソッドを調べるか、コピー コンストラクターを使用できます。

public OBJECT1(OBJECT1 toCopy)
{
    this.field1 = toCopy.field1; 
    this.field2 = toCopy.field2; 
    this.field3 = toCopy.field3; 
    this.field4 = toCopy.field4;     
}
于 2012-08-01T12:43:56.677 に答える
4

これらの変数はオブジェクトへの参照です。各変数を文字列の末尾と考えてください。もう一方の端はオブジェクトに結び付けられています。変数を割り当てると、新しい文字列がオブジェクトに関連付けられます。

コピーを作成するには、(当然のことながら) コピーを作成する必要があります。場合によっては、これは簡単です。これを可能にするコピー コンストラクターがあるかもしれません。

ArrayList<String> copy = new ArrayList<String>(oldArrayList);

また、コピーを作成するメソッドになる場合もあります。たとえば、一部のクラスは次のclone()メソッドを実装します。

Foo copy = (Foo) otherFoo.clone();

オブジェクトをコピーする方法を見つけるには、クラスの API を勉強するだけです。

于 2012-08-01T12:43:01.097 に答える
1

それは何myObjectであるかによって異なります。探している単語cloneは、正確なコピーが必要な場合です。ただし、すべてのオブジェクトがクローンをサポートしているわけではないため、(@Hunter のように) new キーワードを使用して新しいメモリを割り当てる必要があると指摘した独自のクローン メソッドを作成する必要がある場合があります。

于 2012-08-01T12:43:25.707 に答える
0

オブジェクトo1を別のオブジェクトo2に割り当てるときは、o2がo1を指すようにします。したがって、オブジェクトo1を変更するたびに、オブジェクトo2もそれに応じて変更されます。

これは、リスト内のオブジェクトでも同じように発生します。これは、Javaでは、オブジェクトを別のオブジェクトに割り当てるときに、コンテンツをコピーしないが、それを「共有」するようなものであるためです。

すべてから独立した別のオブジェクトを作成する唯一の方法は、newを使用してから、各属性をコピーすることです。

于 2012-08-01T12:52:12.933 に答える
0

したがって、Javaまたは任意のOOP言語で

発言を考えれば

Object obj = new Object()

obj は、実際のオブジェクトが格納されている場所を実際に指すハンドルと呼ばれます。

そのため、obj1 = obj実際に同じ場所を指している2つのハンドルを取得しています

そうすれば、呼び出しにもobj1.setSomething()反映されます。obj.getSomething()

于 2012-08-01T12:46:02.963 に答える
0

変数には、オブジェクトへの参照が含まれています。他の言語では、参照はポインターと呼ばれることがよくあります。そうmyObject1 = myObject2;することで、myObject1変数は変数と同じオブジェクトを参照しmyObject2ます。

オブジェクトのコピーを作成する場合、最善の方法は、たとえばコピー コンストラクターを使用して、自分で実装することです。

public MyClass(MyClass other) {
    this.foo = other.foo;
    this.bar = other.bar;
    ...
}

したがって、

myObject1 = new MyClass(myObject2);
于 2012-08-01T12:46:08.187 に答える