javaのcloneの使い方
javaのcloneの使い方
前言:
cloneはコピーです。Java言語では、cloneメソッドは対象に呼び出されますので、対象をコピーします。コピーオブジェクトとは、まずソースオブジェクトと同じ大きさの空間を割り当てて、この空間で新しいオブジェクトを作成します。java言語では、
1 newオペレータを使ってオブジェクトを作成する
2 clone方法でオブジェクトをコピーする
この二つの方法は何が同じですか?newオペレータの意図はメモリの割り当てです。プログラムがnewオペレータに実行される時は、まずnewオペレータの後ろのタイプを見に行きます。タイプがわかってから、どれぐらいのメモリ空間が割り当てられているかが分かります。メモリの割り当てが完了したら、コンストラクションを呼び出し、オブジェクトの各ドメインを塗りつぶします。このステップをオブジェクトの初期化といい、構造方法が戻ったら、オブジェクトの作成が完了し、彼の参照(住所)を外部に公開し、外部でこの参照を使ってこのオブジェクトを操作できます。また、cloneは、第1ステップはnewと同様にメモリを割り当て、cloneメソッドを呼び出した場合、割り当てられたメモリとソースオブジェクト(すなわち、cloneメソッドを呼び出すオブジェクト)が同じであり、元のオブジェクトのそれぞれの領域を使用して、新しいオブジェクトの領域を塗りつぶし、塗りつぶし終わったら、cloneメソッドは戻り、新しい同じオブジェクトが作成されます。この新しいオブジェクトの参照を外部に公開することもできます。
cloneメソッドは、浅いコピーを実行します。
疑問があれば、メッセージをお願いします。あるいは、当駅のコミュニティで交流して討論してください。ありがとうございます。
前言:
cloneはコピーです。Java言語では、cloneメソッドは対象に呼び出されますので、対象をコピーします。コピーオブジェクトとは、まずソースオブジェクトと同じ大きさの空間を割り当てて、この空間で新しいオブジェクトを作成します。java言語では、
1 newオペレータを使ってオブジェクトを作成する
2 clone方法でオブジェクトをコピーする
この二つの方法は何が同じですか?newオペレータの意図はメモリの割り当てです。プログラムがnewオペレータに実行される時は、まずnewオペレータの後ろのタイプを見に行きます。タイプがわかってから、どれぐらいのメモリ空間が割り当てられているかが分かります。メモリの割り当てが完了したら、コンストラクションを呼び出し、オブジェクトの各ドメインを塗りつぶします。このステップをオブジェクトの初期化といい、構造方法が戻ったら、オブジェクトの作成が完了し、彼の参照(住所)を外部に公開し、外部でこの参照を使ってこのオブジェクトを操作できます。また、cloneは、第1ステップはnewと同様にメモリを割り当て、cloneメソッドを呼び出した場合、割り当てられたメモリとソースオブジェクト(すなわち、cloneメソッドを呼び出すオブジェクト)が同じであり、元のオブジェクトのそれぞれの領域を使用して、新しいオブジェクトの領域を塗りつぶし、塗りつぶし終わったら、cloneメソッドは戻り、新しい同じオブジェクトが作成されます。この新しいオブジェクトの参照を外部に公開することもできます。
package test;
public class Cloneoo {
public static void main(String[] args) {
test t=new test();
t.changeInt();
System.out.println(t);
try {
test t1=(test) t.clone();//
System.out.println(t1);
System.out.println(t1.getI());
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class test implements Cloneable{
private int i=0;
public void setI(int i) {
this.i = i;
}
public int getI() {
return i;
}
public void changeInt(){
this.i=1;
}
@Override
protected Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
test t=null;
t=(test) super.clone();
return t;
}
}
test.test@15db9742
test.test@6d06d69c
1
クラスにいくつかのオブジェクトが含まれている場合は、オブジェクトの複製後に、オブジェクトの中の非基本的なタイプの属性に対しても、cloneメソッドを呼び出して深度コピーを行う必要があります。cloneメソッドは、浅いコピーを実行します。
疑問があれば、メッセージをお願いします。あるいは、当駅のコミュニティで交流して討論してください。ありがとうございます。