程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java object 之clone辦法周全解析

java object 之clone辦法周全解析

編輯:關於JAVA

java object 之clone辦法周全解析。本站提示廣大學習愛好者:(java object 之clone辦法周全解析)文章只能為提供參考,不一定能成為您想要的結果。以下是java object 之clone辦法周全解析正文


 1 protected native Object clone() throws CloneNotSupportedException; 

1、辦法由native症結字潤飾

java中的native症結字表現這個辦法是個當地辦法,【java native解釋】。並且native潤飾的辦法履行效力比非native潤飾的高。

2、辦法由protected潤飾

一個類在籠罩clone()辦法時刻,須要修正成public拜訪潤飾符,如許能力包管其他一切的類都可以或許拜訪這個類的這個辦法。

3、辦法拋出CloneNotSupportedException異常

一個類想要籠罩clone()辦法,必需自己完成java.lang.Cloneable接口,不然會拋出CloneNotSupportedException異常。

2、clone()的感化

注:我們這裡的對象特指龐雜類型的。

1、簡略的=操作

我們曉得,java中的龐雜類型的對象都是援用類型,他們常常存的都是對象的內存地址。是以我們不克不及僅僅經由過程 = 操作符如許簡略的賦值操作。我們將一個對象a 賦值給另外一個對象b ,我們僅僅是將對象a 的內存地址賦值給b ,使得他們兩個對象都是指向的統一個內存地址。如許的效果是,對個中一個對象的修正以後都邑影響到另外一個對象。以下圖表現:

Person p1 = new Person();
Person p2 = p1;

 

2、clone()

應用clone()辦法,可以疾速的創立一個對象的正本,而且兩個對象指向分歧的內存地址。以下圖表現:

Person p1 = new Person();
Person p2 = p1.clone();

3、shallow clone和deep clone1、shallow clone(淺拷貝)

shallow clone是指只clone對象自己,不clone對象裡的字段。只挪用super.clone(),只是shallow clone。固然拷貝以後的對象是指向了分歧的內存地址,然則對象外面的字段照樣和之前的對象指向統一個內存地址。

public class ShallowClone implements Cloneable {

  public String name;
  public int age;
  public Person person;

  public ShallowClone() {
  }

  public ShallowClone(String name, int age, Person person) {
    this.name = name;
    this.age = age;
    this.person = person;
  }

  @Override
  public ShallowClone clone() {
    ShallowClone c = null;
    try {
      c = (ShallowClone) super.clone();
      return c;
    } catch (CloneNotSupportedException e) {
      e.printStackTrace();
    }
    return c;
  }

  public static void main(String[] args) {
    Person p = new Person();
    p.name = "p";
    p.age = 10;

    ShallowClone c1 = new ShallowClone("Jim", 18, p);
    System.out.printf("before clone: c1 = %s, c1.person = %s\n", c1, c1.person);
    ShallowClone c2 = c1.clone();
    System.out.printf("after clone: c2 = %s, c2.person = %s\n", c2, c2.person);
  }
}

運轉main()輸入:

before clone: c1 = cre.sample.test.object.ShallowClone@558385e3, c1.person = cre.sample.test.Person@2dcb25f1
after clone: c2 = cre.sample.test.object.ShallowClone@742808b3, c2.person = cre.sample.test.Person@2dcb25f1

解釋淺拷貝,ShallowClone對象內存地址轉變了,然則對象裡的Person字段內存地址沒有轉變;

2、deep clone(深拷貝)

deep clone則是指在clone對象自己的同時,也clone對象外面的字段。

/**
 * deep clone代碼示例
 * Created by CreGu on 2016/6/9.
 */
public class DeepClone implements Cloneable {
  public String name;
  public int age;
  public Person person;

  public DeepClone() {
  }

  public DeepClone(String name, int age, Person person) {
    this.name = name;
    this.age = age;
    this.person = person;
  }

  @Override
  public DeepClone clone() {
    DeepClone c = null;
    try {
      c = (DeepClone) super.clone();
      c.person = person.clone();
      return c;
    } catch (CloneNotSupportedException e) {
      e.printStackTrace();
    }
    return c;
  }

  public static void main(String[] args) {
    Person p = new Person();
    p.name = "p";
    p.age = 10;

    DeepClone c1 = new DeepClone("Jim", 18, p);
    System.out.printf("before clone: c1 = %s, c1.person = %s\n", c1, c1.person);
    DeepClone c2 = c1.clone();
    System.out.printf("after clone: c2 = %s, c2.person = %s\n", c2, c2.person);
  }
}

運轉main()輸入:

before clone: c1 = cre.sample.test.object.DeepClone@558385e3, c1.person = cre.sample.test.Person@2dcb25f1
after clone: c2 = cre.sample.test.object.DeepClone@742808b3, c2.person = cre.sample.test.Person@70535b58

解釋深拷貝,DeepClone對象內存地址轉變了,然則對象裡的Person字段內存地址也轉變了。

以上這篇java object 之clone辦法周全解析就是小編分享給年夜家的全體內容了,願望能給年夜家一個參考,也願望年夜家多多支撐。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved