深入淺析Java中對象的深復(fù)制與淺復(fù)制

本篇文章為大家展示了深入淺析Java中對象的深復(fù)制與淺復(fù)制,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

創(chuàng)新互聯(lián)專注于企業(yè)網(wǎng)絡(luò)營銷推廣、網(wǎng)站重做改版、遷西網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、HTML5建站、成都商城網(wǎng)站開發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為遷西等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

 Java對象深復(fù)制與淺復(fù)制實例詳解

我們在遇到一些業(yè)務(wù)場景的時候經(jīng)常需要對對象進(jìn)行復(fù)制,對于對象的復(fù)制一般有兩種方式,深復(fù)制和淺復(fù)制

淺復(fù)制:對象的復(fù)制僅是對象本身,對象引用的其它對方并不會復(fù)制。

深復(fù)制:對象的復(fù)制包含對象引用的對象。

Java所有對象的基類提供了clone方法,但是這個方法是protected native修飾,因此只暴露給之類去重寫,外部是無法直接調(diào)用的。

我們現(xiàn)在來測試兩種復(fù)制,首選是淺復(fù)制,淺復(fù)制要實現(xiàn)Cloneable接口。

// 課程對象
class Class {
  private String name;

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

}
// 學(xué)生對象
class User implements Cloneable {
  private String name;
  private Long id;
  // 課程引用
  private Class c;

  public Class getC() {
    return c;
  }

  public void setC(Class c) {
    this.c = c;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }

  @Override
  protected Object clone() throws CloneNotSupportedException {
    return super.clone();
  }

  @Override
  public int hashCode() {
    return super.hashCode();
  }

  @Override
  public boolean equals(Object obj) {

    if (obj instanceof User) {
      User user = (User) obj;
      if (this.id == user.getId() && this.getName() == user.getName()) {
        return true;
      }
      if (user.getId().equals(this.id)
          && user.getName().equals(this.name)) {
        return true;
      }
      return false;
    } else
      return false;
  }

}

我們來測試:

 User user1 = new User();
    User user2 = user1;

    User user3 = (User) user1.clone();

    System.out.println(user1 == user2);
    System.out.println(user3 == user1);
    System.out.println(user3.equals(user1));
    System.out.println(user3.getName() == user3.getName());// true,淺復(fù)制

    Class c = new Class();
    c.setName("語文");
    user1.setC(c);
    // 測試復(fù)制深度
    User user4 = (User) user1.clone();
    System.out.println(user4.getC() == user1.getC()); // true,說明引用的對象依然是同一個對象

對象的復(fù)制并沒復(fù)制引用所指向的對象class,復(fù)制出來的引用指向的同一個地址。

深復(fù)制采用序列化與反序列的方式去獲取,也有種說法類似于腌菜,用流的方式腌制進(jìn)去又取出來,實現(xiàn)深度復(fù)制。

class Car implements Serializable {
  /**
   * 
   */
  private static final long serialVersionUID = 42342L;
  private String name;

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

}

// 深復(fù)制
class People implements Serializable{
  /**
   * 
   */
  private static final long serialVersionUID = 543535212412L;
  private Car car;

  public Car getCar() {
    return car;
  }

  public void setCar(Car car) {
    this.car = car;
  }

  public People deepClone() throws IOException, ClassNotFoundException {
    // 腌制
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(out);
    oos.writeObject(this);
    // 取出
    ByteArrayInputStream input = new ByteArrayInputStream(out.toByteArray());
    ObjectInputStream ois = new ObjectInputStream(input);
    return (People) ois.readObject();
  }

}

測試深復(fù)制:

// 深復(fù)制
    Car car = new Car();
    car.setName("benz");
    People p = new People();
    p.setCar(car);

    try {
      People p2 = p.deepClone();
      System.out.println(p2.getCar() == p.getCar()); // false,說明引用的對象也進(jìn)行了復(fù)制
    } catch (ClassNotFoundException | IOException e) {
      e.printStackTrace();
    }

例外提及一下生成對象的五種辦法:

1.new
2.Class類的newInstance
3.Constructor類newInstance
4.Clone方式
5.反序列化的方式

其中2與3即是反射的方式。

上述內(nèi)容就是深入淺析Java中對象的深復(fù)制與淺復(fù)制,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

分享題目:深入淺析Java中對象的深復(fù)制與淺復(fù)制
文章路徑:http://www.muchs.cn/article46/jidohg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版品牌網(wǎng)站制作、App設(shè)計網(wǎng)站導(dǎo)航、網(wǎng)站策劃、網(wǎng)站營銷

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)