序列化:

  1. Student s = new Student("xianming","男",20);
  2. Teacher t = new Teacher(40,"lihua",s);
  3. Teacher t1;
  4. ObjectOutputStream teacher = new ObjectOutputStream(new FileOutputStream("teacher"));
  5. teacher.writeObject(t);
  6. teacher.close();
  7. File file = new File("teacher");
  8. ObjectInputStream res = new ObjectInputStream(new FileInputStream(file));
  9. t1 = (Teacher) res.readObject();
  10. s.setAge(12);

参考博客:Java对象的序列化(Serialization)和反序列化详解


深浅拷贝:

  1. 一定要实现Cloneable接口,并重写clone方法。
  2. 重写clone方法的时候,调用的是super.clone(),而不是this.clone(),第一次使用的时候写成了this,结果栈溢出,应该调用父类的clone方法,即Object类的clone方法。
  3. 如果要做深拷贝,被拷贝的对象里有其他对象,需要让其他对象也实现Cloneable接口,并重写clone方法
  4. 重要:如果子对象重写了clone方法,父对象需要在自己的clone方法里引用子对象的clone方法,而且是第二种写法。第一次写的时候写成了第一种,是错的,因为被克隆的就是一个新的对象,不能在clone去修改自己的属性了。
  1. protected Teacher clone() throws CloneNotSupportedException {
  2. this.s = s.clone();
  3. return (Teacher) super.clone();
  4. }
  1. protected Teacher clone() throws CloneNotSupportedException {
  2. Teacher t = (Teacher) super.clone();
  3. t.s = s.clone();
  4. return t;
  5. }