2017-04-21 4 views
0

私はパッケージ内に3つのクラスを持っていますpack1。 3つのクラスはclassAclassBclassCです。Javaでクローンとディープクローンをシャローにする方法は?

classA

public class Address { 
    public String town = null; 
    public String street = null; 
    public int postCode = 0; 
    public int houseNumber = 0; 
} 

classB

public class Course { 
    public String number; 
    public String name; 

    public Course(){ 
     number = null; 
     name = null; 
    } 

classC

public class Student { 
    public Date dob; 
    public Course course = new Course(); 
    public Address address = new Address(); 


    public Student(){ 
     dob = null; 
     course.name = null; 
     course.number = null; 
     address.town = null; 
     address.street = null; 
     address.postCode = 0; 
     address.houseNumber = 0; 
     course.name = null; 
     course.number = null; 

    } 

私はどのように深いクローンアドレスとDOBと浅いクローンのコースを知りたいんですか?クローン作成のコンボを行う方法がわかりません

答えて

1

浅いコピーを実行するには、1つの変数を別の変数に設定するだけです。浅いコピーとは、元のコピーと実際に同じオブジェクトであることを意味します。あなたが持っている場合:

course2 = course1; 
course2.name = "math"; 

をcourse1とcourse2が同じオブジェクトであるため、その後、course1の名前も、 『数学』に変更されます。

深いクローンを作成するには、オブジェクト自体ではなく、オブジェクト内のすべてをコピーする必要があります。この場合

course2 = new Course(); 
course2.name = course1.name; 
//... 
course2.name = "math"; 

course2自体が新しいオブジェクトとして作られた、とcourse1に設定されていなかったので、course1の名前は、変更されません。

+0

「course2 = course1」の割り当てはシャローコピーではなく、単なる参照です。浅いまたは深いとは、コピーされたオブジェクトのオブジェクトプロパティが管理される方法を指します –

1

ShallowCopy: オブジェクトのシャローコピーは、元のオブジェクトのすべてのフィールドの正確なコピーを持ちます。元のオブジェクトが他のオブジェクトへの参照をフィールドとして持つ場合、それらのオブジェクトの参照のみが複製オブジェクトにコピーされ、それらのオブジェクトのコピーは作成されません。

ディープコピー:オブジェクトの ディープコピーがちょうど浅いコピーのように、元のオブジェクトのすべてのフィールドの完全なコピーを持っています。しかし、元のオブジェクトが他のオブジェクトへの参照をフィールドとして持つ場合、それらのオブジェクトのコピーもclone()メソッドを呼び出すことによって作成されます。

コースエンティティにはオブジェクトのリフレッシュがないため、 defalutクローンメソッドを使用します。 日付、コース、住所への参照としての学生エンティティクローンメソッドをオーバーライドする必要があります。以下 はサンプルコードです: - あなたはそれへの変更は、直接そのオブジェクトの元のコピーに影響を与えますので、もし作る

public static class Address implements Cloneable{ 
    public String town = null; 
    public String street = null; 
    public int postCode = 0; 
    public int houseNumber = 0; 

    public Address(String town , String street ,int postCode , int houseNumber){ 
     this.town = town; 
     this.street = street; 
     this.postCode = postCode; 
     this.houseNumber = houseNumber; 
    } 
    public Address(){ 
    } 

    //Default version of clone() method. It creates shallow copy of an object. 

    protected Object clone() throws CloneNotSupportedException 
    { 
     return super.clone(); 
    } 
} 

public static class Course implements Cloneable{ 
    public String number; 
    public String name; 

    public Course(){ 
     number = null; 
     name = null; 
    } 

    public Course(String number , String name){ 
     this.number = number; 
     this.name = name; 
    } 

    //Default version of clone() method. It creates shallow copy of an object. 

    protected Object clone() throws CloneNotSupportedException 
    { 
     return super.clone(); 
    } 

} 

public static class Student implements Cloneable{ 
     public Date dob; 
     public Course course = new Course(); 
     public Address address = new Address(); 



     public Student(){ 
      dob = null; 
      course.name = null; 
      course.number = null; 
      address.town = null; 
      address.street = null; 
      address.postCode = 0; 
      address.houseNumber = 0; 

     } 

     public Student(Date dob , Course course , Address address){ 
      this.dob = dob; 
      this.course = course; 
      this.address = address; 
     } 

     protected Object clone() throws CloneNotSupportedException 
     { 
      Student student = (Student) super.clone(); 

      student.course = (Course) course.clone(); 
      student.address = (Address) address.clone(); 
      student.dob = (Date) dob.clone(); 

      return student; 
     } 
    } 
0

でShallowCopyのみ基準値は、コピーされます。

DeepCopyで、そのオブジェクトの新しいインスタンスを作成し、元のオブジェクトの値で初期化して、新しく初期化したオブジェクトを戻す必要があります。

これはクローンメソッド内で行う必要があります。クローンがdeepcopyと呼ばれるときにそれが実行されます。

関連する問題