当前位置: 移动技术网 > IT编程>开发语言>Java > 浅谈Java中实现深拷贝的两种方式—clone() & Serialized

浅谈Java中实现深拷贝的两种方式—clone() & Serialized

2019年07月19日  | 移动技术网IT编程  | 我要评论

clone() 方法麻烦一些,需要将所有涉及到的类实现声明式接口 cloneable,并覆盖object类中的clone()方法,并设置作用域为public(这是为了其他类可以使用到该clone方法)。

序列化的方法简单,需要将所有涉及到的类实现接口serializable

package b1ch06.clone;

import java.io.serializable;

class car implements cloneable, serializable {
  private string band;

  public car(string band) {
    this.band = band;
  }

  public string getband() {
    return band;
  }

  public void setband(string band) {
    this.band = band;
  }

  @override
  public object clone() throws clonenotsupportedexception {
    return super.clone();
  }
}
package b1ch06.clone;

import java.io.serializable;

class employee implements cloneable, serializable {
  private string name;
  private car car;

  public employee(string name, car car) {
    this.name = name;
    this.car = car;
  }

  public string getname() {
    return name;
  }

  public void setname(string name) {
    this.name = name;
  }

  public car getcar() {
    return car;
  }

  public void setcar(car car) {
    this.car = car;
  }

  protected void test() {
    system.out.println("test func");
  }

  @override
  public object clone() throws clonenotsupportedexception {

    employee employee_cloned = (employee) super.clone();
    car car_cloned = (car) this.car.clone();
    employee_cloned.setcar(car_cloned);
    return employee_cloned;
  }
}


package b1ch06.clone;


import java.io.*;


public class serializedclone {
  @suppresswarnings("unchecked")
  public static <t extends serializable> t clone(t obj) {
    t cloneobj = null;
    try {
      //写入字节流
      bytearrayoutputstream out = new bytearrayoutputstream();
      objectoutputstream obs = new objectoutputstream(out);
      obs.writeobject(obj);
      obs.close();

      //分配内存,写入原始对象,生成新对象
      bytearrayinputstream ios = new bytearrayinputstream(out.tobytearray());
      objectinputstream ois = new objectinputstream(ios);
      //返回生成的新对象
      cloneobj = (t) ois.readobject();
      ois.close();
    } catch (exception e) {
      e.printstacktrace();
    }
    return cloneobj;
  }


}
package b1ch06.clone;

public class myclone {


  public static void main(string[] args) {
    car car = new car("bmw");
    employee employee = new employee("andy", car);
    // 方法一:覆盖所有涉及到的类的clone()方法
    try {

      employee employee_cp = (employee) employee.clone();

      system.out.println("=========================");
      system.out.println("original对象地址?:");
      system.out.println(employee.tostring());
      system.out.println("copy对象地址?:");
      system.out.println(employee_cp.tostring());
      system.out.println("前后两个对象指向同一地址?:");
      system.out.println(employee_cp == employee);
      system.out.println("=========================");

      system.out.println("original对象中car对象地址?:");
      system.out.println(employee.getcar().tostring());
      system.out.println("copy对象中car对象地址?:");
      system.out.println(employee_cp.getcar().tostring());
      system.out.println("前后两个car对象指向同一地址?:");
      system.out.println(employee_cp == employee);

    } catch (clonenotsupportedexception e) {
      e.printstacktrace();
    }

    // 方法二:序列化实现深拷贝
    employee cloned_employee = serializedclone.clone(employee);
    system.out.println("=========================");
    system.out.println("original对象地址?:");
    system.out.println(employee.tostring());
    system.out.println("copy对象地址?:");
    system.out.println(cloned_employee.tostring());
    system.out.println("前后两个对象指向同一地址?:");
    system.out.println(cloned_employee == employee);

    system.out.println("=========================");

    system.out.println("original对象中car对象地址?:");
    system.out.println(employee.getcar().tostring());
    system.out.println("copy对象中car对象地址?:");
    system.out.println(cloned_employee.getcar().tostring());
    system.out.println("前后两个car对象指向同一地址?:");
    system.out.println(cloned_employee == employee);

  }
}

以上所述是小编给大家介绍的java中实现深拷贝的两种方式--——clone() & serialized详解整合,希望对大家有所帮助

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网