实现Cloneable接口,重写Object类的clone()方法
对象clone:参考
集合clone:参考
public class TestClone {
/**
* 1.现象一:Student类未实现Cloneable接口,会报错
* 原因:在main函数调用clone方法时,会直接调用Object类的方法,直接抛出throws CloneNotSupportedException异常
* 2.现象二:那为啥实现了Cloneable接口就不报错,Cloneable接口还是个空接口,更离谱 -> 见Cloneable接口上方的英文
* 原因:类实现了Cloneable接口来指示Object.clone()方法,该方法可以对该类的实例进行字段对字段的复制。
* 在没有实现Cloneable接口的实例上调用对象的克隆方法会引发异常CloneNotSupportedException。
* 按照惯例,实现这个接口的类应该覆盖Object。使用公共方法克隆(受保护)。有关重写此方法的详细信息,请参阅Object.clone()。
* 请注意,该接口不包含克隆方法。因此,仅凭一个对象实现了这个接口就克隆它是不可能的。即使反射地调用clone方法,也不能保证它会成功。
*/
public static void main(String[] args) throws CloneNotSupportedException {
ArrayList<Student> list=new ArrayList<Student>();
Student stJack=new Student("Jack", 13);
Student stTom=new Student("Tom", 15);
list.add(stJack);
list.add(stTom);
//深拷贝
ArrayList<Student> listCopy=new ArrayList<Student>();
for (Student student : list) {
listCopy.add((Student) student.clone());
}
//对listCopy的元素修改不影响list的元素
listCopy.get(0).setAge(20);
System.out.println(list);
System.out.println(listCopy);
//[Student [name=Jack, age=13], Student [name=Tom, age=15]]
//[Student [name=Jack, age=20], Student [name=Tom, age=15]]
}
}
class Student implements Cloneable{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
// @Override
// protected Student clone(){ // 错误方法!!!
// Student stuent = new Student(this.name,this.age);
// return stuent;
//
// }
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}