java編程基礎之克隆

         寫下克隆的基本應用,直接上代碼。

 

public class School implements Cloneable,Serializable
{

	/**
	 * 序列號
	 */
	private static final long serialVersionUID = -5901996525103006668L;

	/**
	 * 校名
	 */
	private String schoolName;
	
	/**
	 * 校址
	 */
	private String schoolAddr;
	
	/**
	 * 年級列表
	 */
	private List<String> gradeList;
	
	/**
	 * 學生集合
	 */
	private List<Student> students;

	public String getSchoolName()
	{
		return schoolName;
	}

	public void setSchoolName(
			String schoolName)
	{
		this.schoolName = schoolName;
	}

	public String getSchoolAddr()
	{
		return schoolAddr;
	}

	public void setSchoolAddr(
			String schoolAddr)
	{
		this.schoolAddr = schoolAddr;
	}

	public List<String> getGradeList()
	{
		return gradeList;
	}

	public void setGradeList(
			List<String> gradeList)
	{
		this.gradeList = gradeList;
	}

	public List<Student> getStudents()
	{
		return students;
	}

	public void setStudents(
			List<Student> students)
	{
		this.students = students;
	}
	
	@Override
	public String toString()
	{
		StringBuilder sb = new StringBuilder();
		sb.append("SchoolName:").append(schoolName).append("; SchoolAddr:").
		append(schoolAddr).append("; gradeList:").append(gradeList).
		append("; students:").append(students);
		
		return sb.toString();
	}
	
	@Override
	public School clone()
	{
		School o = null;
		
		try
		{
			o = (School)super.clone();
			o.students = new ArrayList<Student>();
			for(int i = 0; i < this.students.size(); i++)
			{
				o.students.add((Student) this.getStudents().get(i).clone());
			}
		}
		catch (CloneNotSupportedException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return o;
	}
}

 

public class Student implements Cloneable,Serializable
{
	/**
	 * 序列號
	 */
	private static final long serialVersionUID = 2406356866030064091L;

	/**
	 * 姓名
	 */
	private String name;
	
	/**
	 * 性別
	 */
	private String sex;
	
	/**
	 * 年齡
	 */
	private String age;

	public String getName()
	{
		return name;
	}

	public void setName(String name)
	{
		this.name = name;
	}

	public String getSex()
	{
		return sex;
	}

	public void setSex(String sex)
	{
		this.sex = sex;
	}

	public String getAge()
	{
		return age;
	}

	public void setAge(String age)
	{
		this.age = age;
	}
	
	@Override
	public String toString()
	{
		StringBuilder sb = new StringBuilder();
		sb.append("name:").append(name).append("; age:").append(age).
		append("; sex:").append(sex);
		
		return sb.toString();
	}
	
	/**
	 * 複寫clone()方法,給該對象提供克隆能力
	 */
	@Override
	public Student clone()
	{
		Student o = null;
		try
		{
			o = (Student)super.clone();
		}
		catch (CloneNotSupportedException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return o;
	}

}
public class TestJavaClone
{
	public static void main(String[] args)
	{
		School school = new School();
		school.setSchoolName("2th school");
		school.setSchoolAddr("ABC Street");
		
		List<String> gradeList = new ArrayList<String>();
		gradeList.add("grade 1");
		gradeList.add("grade 2");
		gradeList.add("grade 3");
		school.setGradeList(gradeList);
		
		List<Student> students = new ArrayList<Student>();
		Student stu1 = new Student();
		stu1.setAge("12");
		stu1.setName("zh");
		stu1.setSex("boy");
		
		Student stu2 = new Student();
		stu2.setAge("13");
		stu2.setName("li");
		stu2.setSex("girl");
		
		students.add(stu1);
		students.add(stu2);
		
		school.setStudents(students);
		
		School cloneSch = school.clone();
		
		System.out.println(cloneSch);
		
		cloneSch.setSchoolAddr("abc Street");
		cloneSch.setSchoolName("1th School");
				
		cloneSch.getGradeList().add("grade 4");
		cloneSch.getStudents().get(0).setAge("22");
		System.out.println("school : " + school);
		System.out.println("clone school:" + cloneSch);
	}

}


   克隆對象,注意對數組和對象的克隆,避免淺克隆導致克隆對象和原對象的耦合。

  


 

 

    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章