写下克隆的基本应用,直接上代码。
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);
}
}
克隆对象,注意对数组和对象的克隆,避免浅克隆导致克隆对象和原对象的耦合。