1. 程式人生 > >一看就懂的,java深拷貝淺拷貝

一看就懂的,java深拷貝淺拷貝

由前面的分析,淺拷貝無法實現含有其他物件引用的本物件的拷貝。那麼很顯然,深拷貝,就是說建立一個新物件,然後將當前物件的非靜態欄位複製到該新物件,無論該欄位是值型別的還是引用型別,都乖乖的進行復制。
有了這個出發點,其實改起來很好改啊。淺拷貝的死穴就在於原始物件及其副本引用同一個物件,那我們讓他們不指向同一個物件不就完了嘛!見程式碼:
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();
	}
}
程式執行結果: