1> 为了获取对象的一份拷贝,我们可以利用Object类的clone()方法。
2> 在派生类中覆盖基类的clone(),并声明为public。3> 在派生类的clone()方法中,调用super.clone()。4> 在派生类中实现Cloneable接口。4> 没有抽象方法的接口叫标识接口。5> 为什么我们在派生类中覆盖Object的clone()方法时,一定要调用super.clone()呢?在运行时刻,Object 的clone()方法能识别出你要复制的是哪一个对象,然后为此对象分配空间,并进行对象的复制,将原 始对象的内容一一复制到新的对象空间去。* 浅克隆是针对没有引用类型的变量来克隆。针对引用类型的克隆应该用Deeply Clone。浅克隆:Code:class FleetClone{public static void main(String[] args){ PRofessor p=new Professor("feiyang",23); Student s1=new Student("zhangshan",18,p); Student s2=(Student)s1.clone(); s2.p.name="feifei"; s2.p.age=30; System.out.println("name="+s1.p.name+","+"age="+s1.p.age);}}class Professor{String name;int age;Professor(String name,int age){this.name=name;this.age=age;}}
class Student implements Cloneable{Professor p;String name;int age;Student(String name, int age,Professor p){this.name=name;this.age=age;this.p=p;}public Object clone(){Object o=null;try{ o=super.clone();}catch(CloneNotSupportedException e){ e.printStackTrace();}return o;}}改变学生s2的教授信息,打印s1教授信息,结果为:name=feifei,age=30.产生这个结果是因为String是一个常量类型.深克隆code:class DeeplyClone{public static void main(String[] args){ Professor p=new Professor("feiyang",23); Student s1=new Student("zhangshan",18,p); Student s2=(Student)s1.clone(); s2.p.name="Bill.Gates"; s2.p.age=30; System.out.println("name="+s1.p.name+","+"age="+s1.p.age);}}class Professor implements Cloneable{String name;int age;Professor(String name,int age){this.name=name;this.age=age;}public Object clone(){Object o=null;try{ o=super.clone();}catch(CloneNotSupportedException e){ e.printStackTrace();}return o;}}
class Student implements Cloneable{Professor p;String name;int age;Student(String name, int age,Professor p){this.name=name;this.age=age;this.p=p;}public Object clone(){//Object o=null;Student o=null;try{ o=(Student)super.clone();}catch(CloneNotSupportedException e){ e.printStackTrace();}o.p=(Professor)p.clone();return o;}}打印结果为:name=Bill.Gates,age=30,这就是深克隆.
新闻热点
疑难解答