一、clone的用法:
package chatRoom.F5; class Person implements Cloneable{//1. public String name; public Person(String name) { this.name = name; } //2. protected Person clone() throws CloneNotSupportedException { return (Person)super.clone();//重写Object类的clone } } //clone(): 复制对象。 public class CloneDemo { public static void main(String[] args) throws CloneNotSupportedException { Person p1=new Person("zs"); Person p2=p1.clone();//p2表示复制出来的第二份儿对象 } }
二、clone的浅克隆:
如果具有引用类型成员变量的类,单纯的重写了clone方法。 则调用clone方法进行对象克隆时就是浅克隆(只是克隆了此类对象,内部的引用类型属性指向的对象没有被克隆)。
package chatRoom.F5; class Person implements Cloneable{//1. public String name; public Person(String name) { this.name = name; } //2. protected Person clone() throws CloneNotSupportedException { return (Person)super.clone();//重写Object类的clone } } class ClassRoom implements Cloneable{ int id; Person p1; protected ClassRoom clone() throws CloneNotSupportedException { return (ClassRoom)super.clone();//浅克隆 } } public class CloneDemo { public static void main(String[] args) throws CloneNotSupportedException { ClassRoom c=new ClassRoom();//第一个ClassRoom c.p1=new Person("赵公明"); //ClassRoom复制时,没有复制ClassRoom里边的Person对象 ClassRoom d=c.clone();//第2个ClassRoom System.out.println(c.p1 == d.p1); } }
三、clone的深克隆:
如果具有引用类型成员变量的类,此时若需要进行深克隆,则需要重写了clone方法,并在clone方法中调用引用类型成员变量的clone方法对引用类型变量指向的对象都进行克隆。
package chatRoom.F5; class Person implements Cloneable{//1. public String name; public Person(String name) { this.name = name; } //2. protected Person clone() throws CloneNotSupportedException { return (Person)super.clone();//重写Object类的clone } } class ClassRoom implements Cloneable{ int id; Person p1; protected ClassRoom clone() throws CloneNotSupportedException { //改进:实现深克隆 //方式:p1也调用clone ClassRoom c=(ClassRoom)super.clone(); c.p1=p1.clone(); return c;//浅克隆 //return (ClassRoom)super.clone(); } } public class CloneDemo { public static void main(String[] args) throws CloneNotSupportedException { ClassRoom c=new ClassRoom();//第一个ClassRoom c.p1=new Person("赵公明"); //ClassRoom复制时,没有复制ClassRoom里边的Person对象 ClassRoom d=c.clone();//第2个ClassRoom //c中的p1对象的地址==d中的p1对象的地址 System.out.println(c.p1 == d.p1);//false } }