new
キーワードを使用してオブジェクトを作成することと、を使用してオブジェクトを作成することの違いは何clone()
ですか?メモリ割り当てに違いはありますか?
5 に答える
new
コンストラクターに従ってオブジェクトをclone()
作成し、新しいオブジェクトを作成し、元のオブジェクトの内容でフィールドを初期化します。
私はそれを理解しています、あなたはjavadocを読んでいるので、例を見てみましょう:
public class MyBaby implements Cloneable {
int age = 0;
String name = "Dolly";
List<String> list = new ArrayList<String>();
public static void main(String[] args) {
MyBaby originalBaby = new MyBaby();
originalBaby.setAge(1);
try {
// We clone the baby.
MyBaby clonedBaby = (MyBaby) originalBaby.clone();
// both babies now have: age 1, name "Molly" and an empty arraylist
originalBaby.setAge(2);
// originalBaby has age 2, the clone has age 1
originalBaby.setName("Molly");
// same goes for the String, both are individual fields
originalBaby.getList().add("addedString");
// both babies get the string added to the list,
// because both point to the same list.
System.out.println(clonedBaby.toString());
}
catch (CloneNotSupportedException e) {}
}
}
javadoc は次のように述べています。
このメソッドは、「ディープ コピー」操作ではなく、このオブジェクトの「浅いコピー」を実行します。
これは、赤ちゃんのリストの動作を説明しています。参照されている要素ではなく、参照がコピーされるため、コピーは「浅い」です。
もちろん、メモリ割り当ては異なる場合があります。
- コンストラクターでフィールドを初期化できます
- clone はフィールド、つまり配列を初期化できます
new
演算子は新しいオブジェクトをインスタンス化しますが、コピー コンストラクターclone()
に似ています。メソッドは、メンバー属性の値もコピーされたオブジェクトのコピーを作成します。clone()
簡単に言うと、
new はインスタンスを作成します
その間
clone は、インスタンスのクローンを返します。
Clone()は、同じクラスの新しいインスタンスを作成し、すべてのフィールドを新しいインスタンスにコピーして返します (浅いコピー)。
newキーワードは、オブジェクトを作成する Java 演算子です ( http://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html )。
- デフォルトのコンストラクターによるオブジェクトの new() 構築。
- clone() は、参照の浅いコピーを行います。
オブジェクト作成のコストが高く、クローンを作成して動作を設定したい場合にのみ、クローンを使用する必要があります。