淺談Java中實(shí)現(xiàn)深拷貝的兩種方式—clone() & Serialized
clone() 方法麻煩一些,需要將所有涉及到的類實(shí)現(xiàn)聲明式接口 Cloneable,并覆蓋Object類中的clone()方法,并設(shè)置作用域?yàn)閜ublic(這是為了其他類可以使用到該clone方法)。
序列化的方法簡(jiǎn)單,需要將所有涉及到的類實(shí)現(xiàn)接口Serializable
package b1ch06.clone; import java.io.Serializable; class Car implements Cloneable, Serializable { private String band; public Car(String band) { this.band = band; } public String getBand() { return band; } public void setBand(String band) { this.band = band; } @Override public Object clone() throws CloneNotSupportedException { return super.clone(); } }
package b1ch06.clone; import java.io.Serializable; class Employee implements Cloneable, Serializable { private String name; private Car car; public Employee(String name, Car car) { this.name = name; this.car = car; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Car getcar() { return car; } public void setcar(Car car) { this.car = car; } protected void test() { System.out.println("test func"); } @Override public Object clone() throws CloneNotSupportedException { Employee employee_cloned = (Employee) super.clone(); Car car_cloned = (Car) this.car.clone(); employee_cloned.setcar(car_cloned); return employee_cloned; } }
package b1ch06.clone; import java.io.*; public class SerializedClone { @SuppressWarnings("unchecked") public static <T extends Serializable> T clone(T obj) { T cloneObj = null; try { //寫入字節(jié)流 ByteArrayOutputStream out = new ByteArrayOutputStream(); ObjectOutputStream obs = new ObjectOutputStream(out); obs.writeObject(obj); obs.close(); //分配內(nèi)存,寫入原始對(duì)象,生成新對(duì)象 ByteArrayInputStream ios = new ByteArrayInputStream(out.toByteArray()); ObjectInputStream ois = new ObjectInputStream(ios); //返回生成的新對(duì)象 cloneObj = (T) ois.readObject(); ois.close(); } catch (Exception e) { e.printStackTrace(); } return cloneObj; } }
package b1ch06.clone; public class MyClone { public static void main(String[] args) { Car car = new Car("BMW"); Employee employee = new Employee("ANDY", car); // 方法一:覆蓋所有涉及到的類的clone()方法 try { Employee employee_cp = (Employee) employee.clone(); System.out.println("========================="); System.out.println("original對(duì)象地址?:"); System.out.println(employee.toString()); System.out.println("copy對(duì)象地址?:"); System.out.println(employee_cp.toString()); System.out.println("前后兩個(gè)對(duì)象指向同一地址?:"); System.out.println(employee_cp == employee); System.out.println("========================="); System.out.println("original對(duì)象中car對(duì)象地址?:"); System.out.println(employee.getcar().toString()); System.out.println("copy對(duì)象中car對(duì)象地址?:"); System.out.println(employee_cp.getcar().toString()); System.out.println("前后兩個(gè)car對(duì)象指向同一地址?:"); System.out.println(employee_cp == employee); } catch (CloneNotSupportedException e) { e.printStackTrace(); } // 方法二:序列化實(shí)現(xiàn)深拷貝 Employee cloned_employee = SerializedClone.clone(employee); System.out.println("========================="); System.out.println("original對(duì)象地址?:"); System.out.println(employee.toString()); System.out.println("copy對(duì)象地址?:"); System.out.println(cloned_employee.toString()); System.out.println("前后兩個(gè)對(duì)象指向同一地址?:"); System.out.println(cloned_employee == employee); System.out.println("========================="); System.out.println("original對(duì)象中car對(duì)象地址?:"); System.out.println(employee.getcar().toString()); System.out.println("copy對(duì)象中car對(duì)象地址?:"); System.out.println(cloned_employee.getcar().toString()); System.out.println("前后兩個(gè)car對(duì)象指向同一地址?:"); System.out.println(cloned_employee == employee); } }
以上所述是小編給大家介紹的Java中實(shí)現(xiàn)深拷貝的兩種方式--——clone() & Serialized詳解整合,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
Java中實(shí)現(xiàn)接口與繼承的區(qū)別及說(shuō)明
這篇文章主要介紹了Java中實(shí)現(xiàn)接口與繼承的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03JAVA中常用的設(shè)計(jì)模式:?jiǎn)卫J剑S模式,觀察者模式
設(shè)計(jì)模式(Design pattern)代表了最佳的實(shí)踐,通常被有經(jīng)驗(yàn)的面向?qū)ο蟮能浖_(kāi)發(fā)人員所采用。設(shè)計(jì)模式是軟件開(kāi)發(fā)人員在軟件開(kāi)發(fā)過(guò)程中面臨的一般問(wèn)題的解決方案。這些解決方案是眾多軟件開(kāi)發(fā)人員經(jīng)過(guò)相當(dāng)長(zhǎng)的一段時(shí)間的試驗(yàn)和錯(cuò)誤總結(jié)出來(lái)的。2020-04-04Java狀態(tài)機(jī)的一種優(yōu)雅寫法分享
狀態(tài)機(jī)是一種數(shù)學(xué)模型,對(duì)于我們業(yè)務(wù)實(shí)現(xiàn)有很大的幫助。我們可以用非常多的方法實(shí)現(xiàn)狀態(tài)機(jī),這篇文章就來(lái)介紹一個(gè)狀態(tài)機(jī)優(yōu)雅的實(shí)現(xiàn)方法,希望對(duì)大家有所幫助2023-04-04SpringBoot前后端分離實(shí)現(xiàn)驗(yàn)證碼操作
驗(yàn)證碼的功能是防止非法用戶惡意去訪問(wèn)登錄接口而設(shè)置的一個(gè)功能,今天我們就來(lái)看看在前后端分離的項(xiàng)目中,SpringBoot是如何提供服務(wù)的2022-05-05spring.mvc.servlet.load-on-startup屬性方法源碼解讀
這篇文章主要介紹了spring.mvc.servlet.load-on-startup的屬性方法源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12Java設(shè)計(jì)模式中單一職責(zé)原則詳解
這篇文章主要介紹了Java設(shè)計(jì)模式中單一職責(zé)原則詳解,單一職責(zé)原則 (SRP) 是軟件設(shè)計(jì)中的一個(gè)重要原則,它要求每個(gè)類只負(fù)責(zé)一個(gè)職責(zé),需要的朋友可以參考下2023-05-05