javaのcloneの使い方

1961 ワード

javaの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メソッドは、浅いコピーを実行します。
疑問があれば、メッセージをお願いします。あるいは、当駅のコミュニティで交流して討論してください。ありがとうございます。