0

説明する:

public class SomeClass {
  int aNumber = 0;

  public void changeNumber(int number){
    aNumber = number;
  }

  public int getNumber(){
    return aNumber;
  }
} 


public class Testapp {

  public static void main(String[] args) {
    NewClass object1 = new NewClass();
    NewClass object2 = object1;

    object1.changeNumber(5);
    object2.changeNumber(2);
    System.out.println("object1: "+object1.getNumber());
    System.out.println("object2: "+object2.getNumber());
  }
}

これにより、次のように出力されます。object1:2 object2:2

どのように出力しますか:object1:5 object2:2

4

6 に答える 6

5

次の 2 つのオプションがあります。

1) コピー コンストラクターを実装します。

public SomeClass(SomeClass c) {
  this.aNumber = c.aNumber;
}

次に、コピーを作成します。

SomeClass object2 = new SomeClass(object1);

2) Cloneable インターフェースを実装し、Object.clone() をオーバーライドします。

public class SomeClass implements Cloneable {
  public SomeClass clone() {
    super.clone();
  }
}

次に、コピーを作成します。

SomeClass object2 = object1.clone();

注:変更されないコードは省略しました。

于 2012-07-26T18:28:08.707 に答える
1

オブジェクトのコピーを実行しているのではなく、参照をコピーしています。これは、両方の変数が同じオブジェクトを参照していることを意味します。

オブジェクトを作成するには、newそれを使用するメソッドを使用または呼び出す必要があります。

コピーが必要なので、オブジェクトを実装する必要がありますCloneable(必要に応じて実装しますclone())。

于 2012-07-26T18:25:39.157 に答える
1

現在どのように設定しているかは、両方object1object2がメモリ内の同じ場所を指しているということです。これを行う必要があります:

NewClass object1 = new NewClass();
NewClass object2 = new NewClass();
object1.changeNumber(5);
object2.changeNumber(2);
System.out.println("object1: "+object1.getNumber());
System.out.println("object2: "+object2.getNumber());

このように、object1完全object2に別個のオブジェクトです。

于 2012-07-26T18:26:32.447 に答える
0
 public class Testapp {
public static void main(String[] args) {
 NewClass object1 = new NewClass();
 NewClass object2 = new NewClass();
  object1.changeNumber(5);
 object2.changeNumber(2);
 System.out.println("object1: "+object1.getNumber());
 System.out.println("object2: "+object2.getNumber());   } } 

オブジェクトの新しいインスタンス化を呼び出す必要があります。そうしないと、メモリ内の同じ位置を参照します。

于 2012-07-26T18:26:03.960 に答える
0

1.オブジェクトではなく参照をコピーしました。

2.両方のオブジェクト参照変数がヒープ上の同じオブジェクトを指しているため、両方の答えとして2が得られます。

3.演算子を使用new して、別のオブジェクトを作成し、object2参照に割り当てます。

もう1つ...NewClassではなく、コードで言及されているSomeClassです

SomeClass object1 = new SomeClass();
SomeClass object2 = new SomeClass();
object1.changeNumber(5);
object2.changeNumber(2);
System.out.println("object1: "+object1.getNumber());
System.out.println("object2: "+object2.getNumber());
于 2012-07-26T18:31:07.460 に答える
0

オブジェクトはクラスのインスタンスであり、状態を保持できます。オブジェクトはnew演算子を使用して作成されます - あなたの場合、オブジェクトはで作成されますnew NewClass()

NewClass object1およびNewClass object2オブジェクト参照変数です。これらは C/C++ のポインターのようなものです。参照変数は状態を保持しません。オブジェクトの状態が配置されているメモリの場所を指すだけです。

あなたが言うとNewClass object1 = new NewClass()newオペレーターは NewClass のインスタンスを作成し、object1参照変数に格納されるメモリ位置を返します。あなたが言うときNewClass object2 = object1- に保持されているメモリの場所の詳細object1がコピーされますobject2- ここで注意すべき重要なことは、新しいオブジェクトは作成されないということです。オブジェクトは 1 つしかないため、状態は 1 つしかありません。そのため、変数を使用object1またはobject2参照して状態を変更すると、前の値が上書きされます。

2 つのオブジェクトが必要な場合は、new2 回呼び出す必要があります。これにより、各オブジェクトに個別のメモリ ロケーションが割り当てられます。オブジェクトがあり、オブジェクトの同様のコピー (その状態を新しいメモリ位置にコピーする) が必要な場合は、クラスのclone()メソッドを使用する必要があります。Objectクローン作成は新しいオブジェクトを作成し、オブジェクトの現在の状態を新しいオブジェクトにコピーします。したがって、それを呼び出しNewClass object2 = object1.clone()て新しいオブジェクトを作成し、object1 の状態をそれにコピーして参照を返す場合、object2ここでobject2はローカル コピーとも呼ばれます。クローン作成には Java の仕様に従う必要があります。つまりCloneable、オブジェクトのクローン作成をサポートするインターフェイスを実装する必要があります。このリンクを参照して、http://en.wikipedia.org/wiki/Clone_ (Java_method )から始めてください。

于 2012-07-26T18:42:18.663 に答える