小栗子实现浅克隆(对象中的都是基本类型变量才可以)
实现Cloneable接口,重写clone()方法,通过super.clone()来实现克隆
public class Student implements Cloneable {
private String name;
private int age;
public Student(String name,int age) {
this.name=name;
this.age=age;
}
@Override
protected Object clone() throws CloneNotSupportedException {
Student student=null;
// Object中的clone()识别出你要复制的是哪一个对象。
student=(Student) super.clone();
return student;
}
public static void main(String[] args) throws CloneNotSupportedException {
Student stu1=new Student("张三",18);
Student stu2=(Student) stu1.clone();
stu2.name="李四";
stu2.age=17;
//stu2的值修改后不影响stu1的
System.out.println("stu1 name:"+stu1.name+"age:"+stu1.age);
System.out.println("stu2 name:"+stu2.name+"age:"+stu2.age);
}
}
深克隆
普通深克隆:被克隆对象实现Cloneable接口,对象的引用对象也要实现Cloneable接口,同时clone()方法中,对象通过super.clone(),对象的引用变量对象也要 .clone()进行克隆
public class Teacher implements Serializable{
String name;
int age;
public Teacher(String name, int age) {
super();
this.name = name;
this.age = age;
}
}
public class DeepStudent implements Cloneable{
public String name;
public int age;
public Teacher teacher;
public DeepStudent(String name, int age, Teacher teacher) {
super();
this.name = name;
this.age = age;
this.teacher = teacher;
}
@Override
public Object clone() throws CloneNotSupportedException {
DeepStudent stu1=null;
stu1=(DeepStudent) super.clone();
stu1.teacher=(Teacher) teacher.clone();
return stu1;
}
public static void main(String[] args) throws CloneNotSupportedException {
Teacher teacher=new Teacher("王老师", 30);
DeepStudent stu1=new DeepStudent("张三", 15, teacher);
DeepStudent stu2=(DeepStudent) stu1.clone();
stu2.teacher.name="赵老师";
stu2.teacher.age=50;
System.out.println("stu1的老师name="+stu1.teacher.name+"age="+stu1.teacher.age);
System.out.println("stu2的老师name="+stu2.teacher.name+"age="+stu2.teacher.age);
}
}
串行化实现深克隆
被克隆对象实现Serializable 接口,自定义一个用于串行化的方法,方法内通过ByteArrayOutputStream和ObjectOutputStream ,ByteArrayInputStream来对对象进行串行化(序列化)最后调用该方法即可实现克隆
public class Teacher implements Serializable{
String name;
int age;
public Teacher(String name, int age) {
super();
this.name = name;
this.age = age;
}
}
public class DeepStudent2 implements Serializable{
String name;
int age;
Teacher teacher;
public DeepStudent2(String name, int age, Teacher teacher) {
super();
this.name = name;
this.age = age;
this.teacher = teacher;
}
public Object deepClone1() throws IOException, ClassNotFoundException {
ByteArrayOutputStream bo=new ByteArrayOutputStream();
ObjectOutputStream oo=new ObjectOutputStream(bo);
oo.writeObject(this);
ByteArrayInputStream bi=new ByteArrayInputStream(bo.toByteArray());
ObjectInputStream oi=new ObjectInputStream(bi);
return (oi.readObject());
}
public static void main(String[] args) throws ClassNotFoundException, IOException {
Teacher teacher=new Teacher("赵老师",30);
DeepStudent2 stu1=new DeepStudent2("张三", 18, teacher);
DeepStudent2 stu2=(DeepStudent2) stu1.deepClone1();
stu2.teacher.name="李老师";
stu2.teacher.age=50;
System.out.println("stu1 "+stu1.teacher.name+",age="+stu1.teacher.age);
System.out.println("stu2 "+stu2.teacher.name+",age="+stu2.teacher.age);
}
}