一、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();//第一个ClassRoomc.p1=new Person("赵公明");//ClassRoom复制时,没有复制ClassRoom里边的Person对象ClassRoom d=c.clone();//第2个ClassRoomSystem.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也调用cloneClassRoom 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();//第一个ClassRoomc.p1=new Person("赵公明");//ClassRoom复制时,没有复制ClassRoom里边的Person对象ClassRoom d=c.clone();//第2个ClassRoom//c中的p1对象的地址==d中的p1对象的地址System.out.println(c.p1 == d.p1);//false}
}