最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java 對(duì)象的克隆(淺克隆和深克?。?/h1>
 更新時(shí)間:2017年07月21日 11:43:25   作者:沈君  
這篇文章主要介紹了java 對(duì)象的克隆的相關(guān)資料,這里對(duì)淺克隆和深克隆進(jìn)行了實(shí)例分析需要的朋友可以參考下

java 對(duì)象的克隆

一、對(duì)象的淺克隆

(1)需要克隆類需要重寫Object類的clone方法,并且實(shí)現(xiàn)Cloneable接口(標(biāo)識(shí)接口,無需實(shí)現(xiàn)任何方法)
(2)當(dāng)需要克隆的對(duì)象中維護(hù)著另外一個(gè)引用對(duì)象,淺克隆不會(huì)克隆另外一個(gè)引用對(duì)下,而是直接復(fù)制維護(hù)的另外一個(gè)引用對(duì)象的地址。
(3)對(duì)象的淺克隆也不會(huì)調(diào)用到構(gòu)造方法。

以下為對(duì)象的淺克隆的一個(gè)例子:

package com.clone;

import java.io.Serializable;

/**
 * Description:
 * 實(shí)現(xiàn)了Cloneable接口,并重寫Object類的clone方法。
 * 
 * @author lee
 * */
public class CloneDemo1 implements Cloneable,Serializable{

  //該克隆類封裝的信息
  public int id;
  public String name;
  public Address address;

  /**
   * Desciption:
   * 默認(rèn)構(gòu)造器
   * 
   * */
  public CloneDemo1(){}

  /**
   * Description:
   * 初始化id,name的構(gòu)造器
   * 
   * @param id id
   * @param name 名字
   * @param address 地址
   * */
  public CloneDemo1(int id, String name, Address address){
    this.id=id;
    this.name=name;
    this.address = address;
  }

  /**
   * Descriptin:
   * 重寫Object類的clone方法。
   * if the object's class does not support the Cloneable interface.
   * Subclasses that override the clone method can also throw this exception 
   * to indicate that an instance cannot be cloned.
   * 
   * @throws CloneNotSupportedException 
   * */
  @Override
  public Object clone() throws CloneNotSupportedException{
    return super.clone();
  }

  /**
   * Description:
   * 重寫toString方法
   * 
   * @return "id="+id+", name="+name
   * */
  @Override
  public String toString(){
    return "id="+id+", name="+name+", address:"+address.getAddress();
  }

  /**
   * Description:
   * 主方法
   * 
   * */
  public static void main(String[] args) throws CloneNotSupportedException{

    CloneDemo1 c1 = new CloneDemo1(1,"c1",new Address("北京"));
    //c2 復(fù)制了c1的地址,并沒有復(fù)制整個(gè)c1對(duì)象
    CloneDemo1 c2 = c1;
    //c3 對(duì)象的淺克隆,復(fù)制了整個(gè)對(duì)象
    CloneDemo1 c3 = (CloneDemo1)c1.clone();

    //當(dāng)對(duì)象c1改變其name或者id的時(shí)候,c2也會(huì)自動(dòng)改變。
    //因?yàn)閏2只是復(fù)制了c1的地址,并非復(fù)制了c1的整個(gè)對(duì)象。
    //相應(yīng)的c3則不會(huì)隨著c1改變而改變,意味著c3將c1整個(gè)對(duì)象克隆一份出來。

    //當(dāng)是,對(duì)象的淺克隆不會(huì)克隆被克隆對(duì)象當(dāng)中的引用對(duì)象。
    //因此c1改變其中的Address的引用對(duì)象時(shí),c2,c3也會(huì)跟著改變。
    c1.setName("cc");
    c1.address.setAddress("上海");
    System.out.println(c1+"\n"+c2+"\n"+c3);



  }

  public int getId() {
    return id;
  }

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

  public String getName() {
    return name;
  }

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

}

/**
 * Description:
 * 一個(gè)封裝著地址的類
 * 
 * @author lee
 * */
class Address implements Serializable{
  public String address;

  /**
   * Description:
   * 默認(rèn)構(gòu)造器
   * 
   * */
  public Address(){}

  /**
   * Description:
   * 初試化address
   * 
   * @param address 地址
   * */
  public Address(String address){
    this.address = address;
  }

  //address的set和get方法
  public String getAddress() {
    return address;
  }

  public void setAddress(String address) {
    this.address = address;
  }
}

二、對(duì)象的深克隆

就是利用對(duì)象的輸入輸出流把對(duì)象寫到文件上,再讀取對(duì)象的信息,這就是對(duì)象的深克隆。

由于對(duì)象的淺克隆不會(huì)克隆被克隆對(duì)象其中的引用對(duì)象,而是直接復(fù)制其地址。因此,要克隆被克隆對(duì)象當(dāng)中的引用類型則需要對(duì)象的深克隆。

而對(duì)象的深克隆使用的的對(duì)象序列化輸入輸出。

代碼如下:

package com.clone;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

/**
 * Description:
 * 實(shí)現(xiàn)對(duì)象的深克隆
 * 
 * @author lee
 * */
public class CloneDemo2 {

  /**
   * Description:
   * 將對(duì)象輸出到一個(gè)文件當(dāng)中。
   * 
   * @param c 需要被寫到文件當(dāng)中的對(duì)象。
   * */
  public static void writeObject(CloneDemo1 c){

    ObjectOutputStream out = null;
    try{

      //將對(duì)象輸出在一個(gè)object.txt文件當(dāng)中
      out = new ObjectOutputStream(new FileOutputStream("./object.txt"));
      out.writeObject(c);

    }catch(IOException e){
      System.out.println("寫入對(duì)象的時(shí)候發(fā)生了錯(cuò)誤。");
      e.printStackTrace();
    }finally{

      //關(guān)閉資源
      try{
        out.close();
      }catch(IOException e){
        e.printStackTrace();
      }
    }


  }

  /**
   * Description:
   * 從文件中讀取出一個(gè)對(duì)象來,并返回。
   * 
   * @return c 返回一個(gè)對(duì)象。
   * */
  public static CloneDemo1 readObject(){

    CloneDemo1 c = null;
    ObjectInputStream input = null;
    try{
      //從object.txt文件中讀取一個(gè)對(duì)象出來
      input = new ObjectInputStream(new FileInputStream("./object.txt"));
      c = (CloneDemo1)input.readObject();

    }catch(IOException | ClassNotFoundException e){
      e.printStackTrace();
      System.out.println("讀取對(duì)象的時(shí)候發(fā)生了錯(cuò)誤。");
    }finally{
      //關(guān)閉資源
      try{
        input.close();
      }catch(IOException e){
        e.printStackTrace();
      }
    }
    return c;
  }
  /**
   * Description:
   * 主方法
   * 
   * @throws CloneNotSupportedException 
   * */
  public static void main(String[] args) throws CloneNotSupportedException {
    CloneDemo1 c1 = new CloneDemo1(1,"c1",new Address("北京"));
    //c2 對(duì)象的淺克隆
    CloneDemo1 c2 = (CloneDemo1)c1.clone();
    //c3對(duì)象的深克隆
    writeObject(c1);
    CloneDemo1 c3 = readObject();

    //因?yàn)閷?duì)象的深克隆同時(shí)也克隆了被克隆對(duì)象維護(hù)的另外一個(gè)對(duì)象
    //所以,當(dāng)c1改變其當(dāng)中的維護(hù)的另外一個(gè)對(duì)象的時(shí)候,c3不會(huì)隨之改變。
    //而c2位淺克隆,其維護(hù)的另外一個(gè)對(duì)象只是復(fù)制了c1維護(hù)的對(duì)象的地址,因此會(huì)隨著c1的改變而改變。
    c1.address.setAddress("上海");
    System.out.println(c1+"\n"+c2+"\n"+c3);

  }

}

對(duì)象的序列化,是需要實(shí)現(xiàn)Serializable接口的。

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • IDEA新建Springboot項(xiàng)目(圖文教程)

    IDEA新建Springboot項(xiàng)目(圖文教程)

    下面小編就為大家?guī)硪黄狪DEA新建Springboot項(xiàng)目(圖文教程)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-07-07
  • Java語言描述二叉樹的深度和寬度

    Java語言描述二叉樹的深度和寬度

    這篇文章主要介紹了Java語言描述二叉樹的深度和寬度,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-11-11
  • springboot 配置文件配置項(xiàng)前綴為0的數(shù)字特殊處理方式

    springboot 配置文件配置項(xiàng)前綴為0的數(shù)字特殊處理方式

    這篇文章主要介紹了springboot 配置文件配置項(xiàng)前綴為0的數(shù)字特殊處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java內(nèi)存溢出場(chǎng)景及解決方案

    Java內(nèi)存溢出場(chǎng)景及解決方案

    內(nèi)存溢出是Java應(yīng)用開發(fā)中常見的問題,但通過合理的代碼優(yōu)化、內(nèi)存管理以及JVM參數(shù)調(diào)整,我們可以有效地避免和解決這類問題,這篇文章主要介紹了Java內(nèi)存溢出場(chǎng)景及解決辦法,需要的朋友可以參考下
    2024-04-04
  • Java中List集合去重的幾種方式詳細(xì)解析

    Java中List集合去重的幾種方式詳細(xì)解析

    這篇文章主要介紹了Java中List集合去重的幾種方式詳細(xì)解析,在日常的業(yè)務(wù)開發(fā)中,偶爾會(huì)遇到需要將 List 集合中的重復(fù)數(shù)據(jù)去除掉的場(chǎng)景,那么今天我們來看看幾種LIst集合去重的方式,需要的朋友可以參考下
    2023-11-11
  • maven導(dǎo)入本地jar包的三種方式

    maven導(dǎo)入本地jar包的三種方式

    本文主要介紹了maven導(dǎo)入本地jar包的三種方式,?文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-04-04
  • java之swing表格實(shí)現(xiàn)方法

    java之swing表格實(shí)現(xiàn)方法

    這篇文章主要介紹了java之swing表格實(shí)現(xiàn)方法,以實(shí)例形式分析了swing構(gòu)建表格的方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-09-09
  • 微信跳一跳輔助Java代碼實(shí)現(xiàn)

    微信跳一跳輔助Java代碼實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了微信跳一跳輔助的Java代碼實(shí)現(xiàn)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • java讀取html文件,并獲取body中所有的標(biāo)簽及內(nèi)容的案例

    java讀取html文件,并獲取body中所有的標(biāo)簽及內(nèi)容的案例

    這篇文章主要介紹了java讀取html文件,并獲取body中所有的標(biāo)簽及內(nèi)容的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Java設(shè)計(jì)模式之單例和原型

    Java設(shè)計(jì)模式之單例和原型

    這篇文章介紹了Java設(shè)計(jì)模式之單例和原型,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09

最新評(píng)論

北川| 峨山| 海淀区| 成安县| 佛坪县| 玉龙| 准格尔旗| 拜城县| 南平市| 沁源县| 新乡市| 遵义县| 峨眉山市| 平安县| 襄汾县| 钟山县| 宜昌市| 井冈山市| 台中县| 环江| 甘洛县| 中山市| 西林县| 密山市| 瑞丽市| 庆城县| 安西县| 牟定县| 彩票| 得荣县| 成都市| 农安县| 万山特区| 富源县| 荥经县| 小金县| 灌南县| 崇礼县| 普安县| 鄱阳县| 阳泉市|