您好,登錄后才能下訂單哦!
小編給大家分享一下Java如何實現克隆,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
具體如下:
1、淺復制(淺克隆)這種淺復制,其實也就是把被復制的這個對象的一些變量值拿過來了。最后生成student2還是一個新的對象。
public class CloneTest1 { public static void main(String[] args) throws Exception { Student1 student = new Student1(); student.setAge(24); student.setName("niesong"); Student1 student2 = (Student1)student.clone(); //這個是調用下面的那個方法,然后把這個這個對象Clone到student System.out.println("Age:" + student2.getAge() + " " + "Name:" + student2.getName()); System.out.println("---------------------"); student2.setAge(23); //克隆后得到的是一個新的對象,所以重新寫的是student2這個對象的值 System.out.println(student.getAge()); System.out.println(student2.getAge()); } } //克隆的對象必須實現Cloneable這個接口,而且需要重寫clone方法 class Student1 implements Cloneable { private int age; //定義為private說明這個成員變量只能被被當前類中訪問,如果外部需要獲得,那么就只能通過getAge方法進行獲取 private String name; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public Object clone() throws CloneNotSupportedException { Object object = super.clone(); return object; } }
運行結果:
2、深復制(情況1使用的是在克隆的時候手動進行深克隆)
public class CloneTest2 { public static void main(String[] args) throws Exception { Teacher teacher = new Teacher(); teacher.setAge(40); teacher.setName("teacher zhang"); Student2 student2 = new Student2(); student2.setAge(14); student2.setName("lisi"); student2.setTeacher(teacher); Student2 student3 = (Student2)student2.clone(); //這里是深復制,所以這時候Student2中的teacher就是teacher這個對象的一個復制,就和student3是student2的一個復制 //所以下面teacher.setName只是對他原來的這個對象更改,但是復制的那個并沒有更改 System.out.println(student3.getAge()); System.out.println(student3.getName()); System.out.println(student3.getTeacher().getAge()); teacher.setName("teacher niesong");//不會又任何影響 System.out.println(student3.getTeacher().getName()); } } class Student2 implements Cloneable { private int age; private String name; private Teacher teacher; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Teacher getTeacher() { return teacher; } public void setTeacher(Teacher teacher) { this.teacher = teacher; } @Override public Object clone() throws CloneNotSupportedException { //這一步返回的這個student2還只是一個淺克隆, Student2 student2 = (Student2)super.clone(); //然后克隆的過程中獲得這個克隆的student2,然后調用這個getTeacher這個方方法得到這個Teacher對象。然后實現克隆。在設置到這個student2中的Teacher。 //這樣實現了雙層克隆使得那個teacher對象也得到了復制。 student2.setTeacher((Teacher)student2.getTeacher().clone()); //雙層克隆使得那個teacher對象也得到了復制 return student2; } } class Teacher implements Cloneable { private int age; private String name; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public Object clone() throws CloneNotSupportedException { return super.clone(); } }
運行結果:
3、利用serializable實現深復制(這個是利用Serializable,利用序列化的方式來實現深復制(深克隆),在其中利用了Io流的方式將這個對象寫到IO流里面,然后在從IO流里面讀取,這樣就實現了一個復制,然后實現序列化的這個會將引用的那個對象也一并進行深復制,這樣就實現了這個機制,同時在IO里面讀取數據的時候還使用了裝飾者模式)
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; public class CloneTest3 { public static void main(String[] args) throws Exception { Teacher3 teacher3 = new Teacher3(); teacher3.setAge(23); teacher3.setName("niesong"); Student3 student3 = new Student3(); student3.setAge(50); student3.setName("wutao"); student3.setTeacher3(teacher3); Student3 ss = (Student3)student3.deepCopt(); System.out.println(ss.getAge()); System.out.println(ss.getName()); System.out.println("---------------------"); System.out.println(ss.getTeacher3().getAge()); System.out.println(ss.getTeacher3().getName()); System.out.println("-----------------------"); ss.getTeacher3().setAge(7777); ss.getTeacher3().setName("hhhhh"); System.out.println(teacher3.getAge()); System.out.println(teacher3.getName()); //雖然上面的已經改了,但是改的是那個復制對象后的那個里面的,然后那個原來的那個里面的并沒有改,下面驗證::: System.out.println("-----------------"); System.out.println(ss.getTeacher3().getAge()); System.out.println(ss.getTeacher3().getName()); } } class Teacher3 implements Serializable { // 上面的那個警告可以直接消除,除了使用在設置中不顯示這個警告,還可以使用下面的這兩條語句中的任何一條語句 // 這個serialVersionUID為了讓該類別Serializable向后兼容 // private static final long serialVersionUID = 1L; // private static final long serialVersionUID = 8940196742313994740L; private int age; private String name; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } } class Student3 implements Serializable { private static final long serialVersionUID = 1L; private int age; private String name; private Teacher3 teacher3; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Teacher3 getTeacher3() { return teacher3; } public void setTeacher3(Teacher3 teacher3) { this.teacher3 = teacher3; } //使得序列化student3的時候也會將teacher序列化 public Object deepCopt()throws Exception { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(this); //將當前這個對象寫到一個輸出流當中,,因為這個對象的類實現了Serializable這個接口,所以在這個類中 //有一個引用,這個引用如果實現了序列化,那么這個也會寫到這個輸出流當中 ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis); return ois.readObject(); //這個就是將流中的東西讀出類,讀到一個對象流當中,這樣就可以返回這兩個對象的東西,實現深克隆 } }
運行結果:
以上是“Java如何實現克隆”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。