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

Java實現(xiàn)克隆的三種方式實例總結

 更新時間:2018年08月23日 09:40:33   作者:瘋狂1024  
這篇文章主要介紹了Java實現(xiàn)克隆的三種方式,結合實例形式總結分析了java淺復制、深復制以及使用serializable實現(xiàn)深復制的相關操作技巧,需要的朋友可以參考下

本文實例講述了Java實現(xiàn)克隆的三種方式。分享給大家供大家參考,具體如下:

1、淺復制(淺克?。┻@種淺復制,其實也就是把被復制的這個對象的一些變量值拿過來了。最后生成student2還是一個新的對象。

public class CloneTest1
{
  public static void main(String[] args) throws Exception
  {
    Student1 student = new Student1();
    student.setAge(24);
    student.setName("niesong");
    Student1 student2 = (Student1)student.clone();
    //這個是調(diào)用下面的那個方法,然后把這個這個對象Clone到student
    System.out.println("Age:" + student2.getAge() + " " + "Name:" + student2.getName());
    System.out.println("---------------------");
    student2.setAge(23);
    //克隆后得到的是一個新的對象,所以重新寫的是student2這個對象的值
    System.out.println(student.getAge());
    System.out.println(student2.getAge());
  }
}
//克隆的對象必須實現(xiàn)Cloneable這個接口,而且需要重寫clone方法
class Student1 implements Cloneable
{
  private int age;
  //定義為private說明這個成員變量只能被被當前類中訪問,如果外部需要獲得,那么就只能通過getAge方法進行獲取
  private String name;
  public int getAge()
  {
    return age;
  }
  public void setAge(int age)
  {
    this.age = age;
  }
  public String getName()
  {
    return name;
  }
  public void setName(String name)
  {
    this.name = name;
  }
  @Override
  public Object clone() throws CloneNotSupportedException
  {
    Object object = super.clone();
    return object;
  }
}

運行結果:

2、深復制(情況1使用的是在克隆的時候手動進行深克?。?/p>

public class CloneTest2
{
  public static void main(String[] args) throws Exception
  {
    Teacher teacher = new Teacher();
    teacher.setAge(40);
    teacher.setName("teacher zhang");
    Student2 student2 = new Student2();
    student2.setAge(14);
    student2.setName("lisi");
    student2.setTeacher(teacher);
    Student2 student3 = (Student2)student2.clone();
    //這里是深復制,所以這時候Student2中的teacher就是teacher這個對象的一個復制,就和student3是student2的一個復制
    //所以下面teacher.setName只是對他原來的這個對象更改,但是復制的那個并沒有更改
    System.out.println(student3.getAge());
    System.out.println(student3.getName());
    System.out.println(student3.getTeacher().getAge());
    teacher.setName("teacher niesong");//不會又任何影響
    System.out.println(student3.getTeacher().getName());
  }
}
class Student2 implements Cloneable
{
  private int age;
  private String name;
  private Teacher teacher;
  public int getAge()
  {
    return age;
  }
  public void setAge(int age)
  {
    this.age = age;
  }
  public String getName()
  {
    return name;
  }
  public void setName(String name)
  {
    this.name = name;
  }
  public Teacher getTeacher()
  {
    return teacher;
  }
  public void setTeacher(Teacher teacher)
  {
    this.teacher = teacher;
  }
  @Override
  public Object clone() throws CloneNotSupportedException
  {
    //這一步返回的這個student2還只是一個淺克隆,
    Student2 student2 = (Student2)super.clone();
    //然后克隆的過程中獲得這個克隆的student2,然后調(diào)用這個getTeacher這個方方法得到這個Teacher對象。然后實現(xiàn)克隆。在設置到這個student2中的Teacher。
    //這樣實現(xiàn)了雙層克隆使得那個teacher對象也得到了復制。
    student2.setTeacher((Teacher)student2.getTeacher().clone());
    //雙層克隆使得那個teacher對象也得到了復制
    return student2;
  }
}
class Teacher implements Cloneable
{
  private int age;
  private String name;
  public int getAge()
  {
    return age;
  }
  public void setAge(int age)
  {
    this.age = age;
  }
  public String getName()
  {
    return name;
  }
  public void setName(String name)
  {
    this.name = name;
  }
  @Override
  public Object clone() throws CloneNotSupportedException
  {
    return super.clone();
  }
}

運行結果:

3、利用serializable實現(xiàn)深復制(這個是利用Serializable,利用序列化的方式來實現(xiàn)深復制(深克?。?,在其中利用了Io流的方式將這個對象寫到IO流里面,然后在從IO流里面讀取,這樣就實現(xiàn)了一個復制,然后實現(xiàn)序列化的這個會將引用的那個對象也一并進行深復制,這樣就實現(xiàn)了這個機制,同時在IO里面讀取數(shù)據(jù)的時候還使用了裝飾者模式)

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class CloneTest3
{
  public static void main(String[] args) throws Exception
  {
    Teacher3 teacher3 = new Teacher3();
    teacher3.setAge(23);
    teacher3.setName("niesong");
    Student3 student3 = new Student3();
    student3.setAge(50);
    student3.setName("wutao");
    student3.setTeacher3(teacher3);
    Student3 ss = (Student3)student3.deepCopt();
    System.out.println(ss.getAge());
    System.out.println(ss.getName());
    System.out.println("---------------------");
    System.out.println(ss.getTeacher3().getAge());
    System.out.println(ss.getTeacher3().getName());
    System.out.println("-----------------------");
    ss.getTeacher3().setAge(7777);
    ss.getTeacher3().setName("hhhhh");
    System.out.println(teacher3.getAge());
    System.out.println(teacher3.getName());
    //雖然上面的已經(jīng)改了,但是改的是那個復制對象后的那個里面的,然后那個原來的那個里面的并沒有改,下面驗證:::
    System.out.println("-----------------");
    System.out.println(ss.getTeacher3().getAge());
    System.out.println(ss.getTeacher3().getName());
  }
}
class Teacher3 implements Serializable
{
// 上面的那個警告可以直接消除,除了使用在設置中不顯示這個警告,還可以使用下面的這兩條語句中的任何一條語句
//  這個serialVersionUID為了讓該類別Serializable向后兼容
//  private static final long serialVersionUID = 1L;
//  private static final long serialVersionUID = 8940196742313994740L;
  private int age;
  private String name;
  public int getAge()
  {
    return age;
  }
  public void setAge(int age)
  {
    this.age = age;
  }
  public String getName()
  {
    return name;
  }
  public void setName(String name)
  {
    this.name = name;
  }
}
class Student3 implements Serializable
{
  private static final long serialVersionUID = 1L;
  private int age;
  private String name;
  private Teacher3 teacher3;
  public int getAge()
  {
    return age;
  }
  public void setAge(int age)
  {
    this.age = age;
  }
  public String getName()
  {
    return name;
  }
  public void setName(String name)
  {
    this.name = name;
  }
  public Teacher3 getTeacher3()
  {
    return teacher3;
  }
  public void setTeacher3(Teacher3 teacher3)
  {
    this.teacher3 = teacher3;
  }
  //使得序列化student3的時候也會將teacher序列化
  public Object deepCopt()throws Exception
  {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(bos);
    oos.writeObject(this);
    //將當前這個對象寫到一個輸出流當中,,因為這個對象的類實現(xiàn)了Serializable這個接口,所以在這個類中
    //有一個引用,這個引用如果實現(xiàn)了序列化,那么這個也會寫到這個輸出流當中
    ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
    ObjectInputStream ois = new ObjectInputStream(bis);
    return ois.readObject();
    //這個就是將流中的東西讀出類,讀到一個對象流當中,這樣就可以返回這兩個對象的東西,實現(xiàn)深克隆
  }
}

運行結果:

更多java相關內(nèi)容感興趣的讀者可查看本站專題:《Java面向對象程序設計入門與進階教程》、《Java數(shù)據(jù)結構與算法教程》、《Java操作DOM節(jié)點技巧總結》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總

希望本文所述對大家java程序設計有所幫助。

相關文章

  • 淺談springmvc的DispatcherServlet分析

    淺談springmvc的DispatcherServlet分析

    本篇文章主要介紹了淺談springmvc的DispatcherServlet分析,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • Java魔法堂之調(diào)用外部程序的方法

    Java魔法堂之調(diào)用外部程序的方法

    這篇文章主要介紹了Java魔法堂:調(diào)用外部程序的相關知識,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-02-02
  • java如何實現(xiàn)判斷文件的真實類型

    java如何實現(xiàn)判斷文件的真實類型

    本篇文章主要介紹了java如何實現(xiàn)判斷文件的真實類型,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • Java System.getProperty()-獲取系統(tǒng)參數(shù)案例詳解

    Java System.getProperty()-獲取系統(tǒng)參數(shù)案例詳解

    這篇文章主要介紹了Java System.getProperty()-獲取系統(tǒng)參數(shù)案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Java多態(tài)性抽象類與接口細致詳解

    Java多態(tài)性抽象類與接口細致詳解

    這篇文章主要給大家介紹了關于Java中方法使用的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-08-08
  • Java內(nèi)存模型知識匯總

    Java內(nèi)存模型知識匯總

    本文中,有很多定義和說法,都是筆者自己理解后定義出來的。希望能夠讓讀者可以對Java內(nèi)存模型有更加清晰的認識。當然,如有偏頗,歡迎指正。
    2018-09-09
  • EasyUi+Spring Data 實現(xiàn)按條件分頁查詢的實例代碼

    EasyUi+Spring Data 實現(xiàn)按條件分頁查詢的實例代碼

    這篇文章主要介紹了EasyUi+Spring Data 實現(xiàn)按條件分頁查詢的實例代碼,非常具有實用價值,需要的朋友可以參考下
    2017-07-07
  • java實現(xiàn)html轉pdf方法步驟

    java實現(xiàn)html轉pdf方法步驟

    這篇文章主要給大家介紹了關于java實現(xiàn)html轉pdf方法的相關資料,要將HTML轉換成PDF,我們需要借助Java中的第三方庫,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-08-08
  • IntelliJ IDEA2023中運行Spring Boot找不到VM options進行端口的修改的問題解決

    IntelliJ IDEA2023中運行Spring Boot找不到VM options進

    這篇文章主要介紹了IntelliJ IDEA2023中運行Spring Boot找不到VM options進行端口的修改的問題解決,本文通過圖文并茂的形式給大家介紹的非常詳細,需要的朋友可以參考下
    2023-11-11
  • SpringBoot集成geodesy實現(xiàn)距離計算功能

    SpringBoot集成geodesy實現(xiàn)距離計算功能

    Geodesy:大地測量學的神奇力量 Geodesy,又稱大地測量學,是一門研究地球形狀、大小及其重力場的學科,在地球距離計算中,它扮演著至關重要的角色,故本文給大家介紹了SpringBoot集成geodesy實現(xiàn)距離計算功能,感興趣的朋友可以參考下
    2024-06-06

最新評論

沈阳市| 饶阳县| 石林| 汶川县| 镇赉县| 鄂托克前旗| 二连浩特市| 甘肃省| 蓝田县| 延川县| 宝坻区| 庆城县| 稷山县| 靖边县| 屏山县| 天等县| 泰和县| 明星| 晋宁县| 正定县| 衡南县| 乌拉特中旗| 芷江| 富顺县| 金湖县| 仁怀市| 德化县| 毕节市| 承德县| 龙州县| 祁阳县| 辽阳市| 类乌齐县| 泉州市| 泸西县| 沧源| 会同县| 刚察县| 三明市| 华坪县| 巴彦淖尔市|