0

メソッドパラメーターの参照/値によるJavaのパスについて少し混乱しています。

クラスにコンストラクターがありOuterObjectます:

private InnerObject io;
public OuterObject(InnerObject io){ 
    this.io = io;
}

public InnerObject getInnerObject(){
    return this.io;
}

OuterObject次のようにコピーメソッドに渡すと:

InnerObject io = new InnerObject();
OuterObject o = new OuterObject(io);    
anotherClass.getCopyOf(o);

そして別のクラスで:

public static OuterObject getCopyOf(InnerObject o){
    return new OuterObject(o.getInnerObject());
}

ご覧のとおり、 をパラメーターとして作成しOuterObjectますInnerObject。今私は知りたいです:

return ステートメントから 2 つの新しいオブジェクトを取得しますか?それとも新しいOuterObjectコピーであり、既存のオブジェクトへの同じ参照InnerObjectですか?

4

4 に答える 4

2

newキーワードで作成したのと同じ数のオブジェクトを取得します。

于 2014-12-08T08:38:02.163 に答える
2

まず第一に、一致するコンストラクターがnew Object(o.getInnerObject())ないため、コンパイルされません。Object

で置き換えると仮定すると、 のコンストラクターはそれに渡されたインスタンスのコピーを作成しないため、new OuterObject (o.getInnerObject());の新しいインスタンスにOuterObjectは の同じインスタンスがInnerObject含まれます。oOuterObjectInnerObject

于 2014-12-08T08:35:43.400 に答える
2

オブジェクトを変数またはパラメーターに格納する場合は、常に参照を格納します。オブジェクトがコピーされることはありません。intまたはなどのプリミティブ型のみbooleanがコピーされます。

オブジェクトのコピーを作成したい場合は、java.lang.CloneableインターフェイスとCloneメソッドまたはコピー コンストラクターを使用して、オブジェクトのクローン作成を検討する必要があります。何を選ぶかは好みの問題です。私は通常、何が起こっているのかをより明確に示すため、コピー コンストラクターを好みます。少なくとも私にとっては。

また、あなたの行return new Object(o.getInnerObject());はコンパイルされません。OuterObjectしかし、ここではなく書きたかったのでしょうObject

于 2014-12-08T08:42:48.700 に答える
0

コードの次の行にコンパイル エラーがあります。 return new Object(o.getInnerObject()); o は Object.So のインスタンスであるため、getInnerObject(); のようなメソッドを持つことはできません。また、Object には Object(InnerObject) のようなコンストラクターがありません。だから、変えて

public static Object getCopyOf(Object o){
    return new Object(o.getInnerObject());
}

の中へ

public static OuterObject getCopyOf(Object o){
    return new OuterObject(((OuterObject)o).getInnerObject());
}

今すぐあなたの質問に答えることができます。「new」は常にヒープ メモリに新しいオブジェクトを作成しますが、2 つの outerObjects は同じ innerObject 参照を持ちます。

于 2014-12-08T09:00:17.503 に答える