序列化:
Student s = new Student("xianming","男",20);
Teacher t = new Teacher(40,"lihua",s);
Teacher t1;
ObjectOutputStream teacher = new ObjectOutputStream(new FileOutputStream("teacher"));
teacher.writeObject(t);
teacher.close();
File file = new File("teacher");
ObjectInputStream res = new ObjectInputStream(new FileInputStream(file));
t1 = (Teacher) res.readObject();
s.setAge(12);
参考博客:Java对象的序列化(Serialization)和反序列化详解
深浅拷贝:
- 一定要实现Cloneable接口,并重写clone方法。
- 重写clone方法的时候,调用的是super.clone(),而不是this.clone(),第一次使用的时候写成了this,结果栈溢出,应该调用父类的clone方法,即Object类的clone方法。
- 如果要做深拷贝,被拷贝的对象里有其他对象,需要让其他对象也实现Cloneable接口,并重写clone方法
- 重要:如果子对象重写了clone方法,父对象需要在自己的clone方法里引用子对象的clone方法,而且是第二种写法。第一次写的时候写成了第一种,是错的,因为被克隆的就是一个新的对象,不能在clone去修改自己的属性了。
protected Teacher clone() throws CloneNotSupportedException {
this.s = s.clone();
return (Teacher) super.clone();
}
protected Teacher clone() throws CloneNotSupportedException {
Teacher t = (Teacher) super.clone();
t.s = s.clone();
return t;
}