一看就懂的,java深拷貝淺拷貝
阿新 • • 發佈:2018-12-31
由前面的分析,淺拷貝無法實現含有其他物件引用的本物件的拷貝。那麼很顯然,深拷貝,就是說建立一個新物件,然後將當前物件的非靜態欄位複製到該新物件,無論該欄位是值型別的還是引用型別,都乖乖的進行復制。
有了這個出發點,其實改起來很好改啊。淺拷貝的死穴就在於原始物件及其副本引用同一個物件,那我們讓他們不指向同一個物件不就完了嘛!見程式碼:
有了這個出發點,其實改起來很好改啊。淺拷貝的死穴就在於原始物件及其副本引用同一個物件,那我們讓他們不指向同一個物件不就完了嘛!見程式碼:
程式執行結果:package interfaces.nesting; class Experience { private String educationBackground; private String skills; public void setExperience(String educationBackground, String skills) { // TODO Auto-generated constructor stub this.educationBackground = educationBackground; this.skills = skills; } public String toString() { return educationBackground + skills; } } /* 建立類,實現Clone方法 */ class Resume implements Cloneable{ private String name; //姓名 private String sex; //性別 private int age; //年齡 private Experience experience; //工作經歷 public Resume(String name, String sex, int age) { this.name = name; this.sex = sex; this.age = age; this.experience = new Experience(); } public void setAge(int age) { this.age = age; } public int getAge() { return age; } public Experience getExperience() { return experience; } public void setExperience(String educationBackground, String skills) { experience = new Experience(); experience.setExperience(educationBackground, skills); } public void displayResume() { System.out.println("姓名:"+name+" 性別:"+sex+" 年齡:"+age); System.out.println("工作經歷:"+experience.toString()); } public Object clone() { try { return (Resume)super.clone(); } catch (Exception e) { e.printStackTrace(); return null; } } } public class MainClass { public static void main(String[] args) { Resume zhangsan = new Resume("zhangsan","男",24); zhangsan.setExperience("2009-2013就讀於家裡蹲大學","精通JAVA,C,C++,C#等程式碼拷貝和貼上"); zhangsan.displayResume(); Resume zhangsan2 = (Resume)zhangsan.clone(); zhangsan2.setExperience("2009-2013就讀於家裡蹲大學","精通JAVA,C,C++,C#等"); zhangsan2.displayResume(); zhangsan.displayResume(); zhangsan2.displayResume(); } }