ホームページ > Java > &#&チュートリアル > Java クローン コード例の概要

Java クローン コード例の概要

黄舟
リリース: 2017-03-15 11:44:15
オリジナル
1611 人が閲覧しました

机上ではやっと気づいたけど、詳しくやらないといけないのは分かっている - Autou 那は Qu に、生きた水の源が来たほどはっきりしているように頼みました - Zhu Xi クローンと
コピー

:

人P1 =
新しい

があるとき人("名前",年齢);

人 p2=p1; この時点では、p1 と p2 は両方ともメモリ内の同じオブジェクトを指しています。相手。 関数の引数がオブジェクトの場合、参照型が渡され、オブジェクト関数内の演算が外部オブジェクトに影響を与えます。 オブジェクトのコピーを転送したい場合は、objectの clone() メソッドを使用する必要があります。 ) コピー オブジェクトは参照ではなく新しいオブジェクトを返します。コピー オブジェクトと new 演算子によって返される新しいオブジェクトの違いは、コピー オブジェクトには初期情報ではなく、元のオブジェクトの情報が既に含まれていることです。オブジェクトの。 いつ使用するかhallow クローン (浅いコピー、シャドウ コピー) 、いつ 深いクローン (ディープ コピー) を使用するか: 主に、特定のドメイン オブジェクトの性質によって異なります。 基本タイプの場合は、浅いクローン を使用します。参照 変数 (参照 変数 ) はディープ クローン を使用します。 クローン作成の実装手順: (1) Cloneableインターフェースを実装します。Cloneableには、フラグインターフェースと呼ばれる抽象メソッドがありません。 (2) 基本クラスの clone メソッドをオーバーライドして public として宣言(3) 派生クラスの clone メソッドをオーバーライドして super.clone() を呼び出す

clone Shallow に分割コピーとディープ コピーとは、パラメータが基本型であるか参照型であるかに関係なく、super.clone() が直接呼び出され、コピーされた結果の参照型が依然として同じメモリを指すことを意味します。 super.clone() を呼び出した後、ディープコピーを実現するには、コピーする参照パラメータの clone() 関数を呼び出します。

浅いコピー: (1) 基本的な

データ型

(String) は新しいオブジェクトをコピーします

(2) 参照オブジェクトは引き続き同じオブジェクトを参照します。

浅いコピーのサンプルコード:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

public class Info {

    public int idnumber;

    public int getIdnumber() {

    return idnumber;

    }

    public void setIdnumber(int idnumber) {

        this.idnumber = idnumber;

    }

}

public class Person  implements Cloneable{

    private int age;

    private String nameString;

    public Info info;

    public Info getInfo() {

        return info;

    }

    public void setInfo(Info info) {

        this.info = info;

    }

    public int getAge() {

        return age;

    }

    public void setAge(int age) {

        this.age = age;

    }

    public String getNameString() {

        return nameString;

    }

    public void setNameString(String nameString) {

        this.nameString = nameString;

    }

    public String toString()

    {

        return "name:"+nameString+",age:"+age+",idnumber"+info.idnumber;

    }

    public Object clone()

    {

        Person person=null;

        try {

            person=(Person)super.clone(); //浅拷贝

            //person.info=(Info)info.clone();

        } catch (CloneNotSupportedException e) {

        // TODO 自动生成的 catch 块

        e.printStackTrace();

        }

        return person;

    }

}

 

public class Hello {

public static void main(String[] args) {

// TODO 自动生成的方法存根

Info info=new Info();

info.setIdnumber(100);

Person person1=new Person();

person1.setAge(10);

person1.setNameString("tiantian");

person1.info=info;

Person person2=(Person)person1.clone();

person2.setNameString("hello");

person2.setAge(20);

person2.info.setIdnumber(200);

System.out.println("person2"+person2);

System.out.println("person1"+person1);

}

}

ログイン後にコピー
最終結果は次のようになります:

1

2

person2name:hello,age:20,idnumber200

person1name:tiantian,age:10,idnumber200

ログイン後にコピー
person1 と person2 の基本型の名前と年齢は変更されていますが、参照型の idnumber 値は変更されていません。 ディープコピー:

(1)对存在的引用类型也进行拷贝,浅拷贝与深拷贝的代码还是有不同点的。


深拷贝代码示例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

public class Info implements Cloneable {//Info也进行拷贝

    public int idnumber;

    public int getIdnumber() {

        return idnumber;

    }

    public void setIdnumber(int idnumber) {

        this.idnumber = idnumber;

    }

    public Object clone()

    {

        Info info=null;

        try {

            info=(Info)super.clone();

        } catch (CloneNotSupportedException e) {

        // TODO 自动生成的 catch 块

        e.printStackTrace();

        }

        return info;

    }

}

 

public class Person  implements Cloneable{

 

private int age;

    private String nameString;

    public Info info;

 

    public Info getInfo() {

        return info;

    }

    public void setInfo(Info info) {

        this.info = info;

    }

    public Person() {

        // TODO 自动生成的构造函数存根

 

    }

    public int getAge() {

        return age;

    }

    public void setAge(int age) {

        this.age = age;

    }

    public String getNameString() {

        return nameString;

    }

    public void setNameString(String nameString) {

        this.nameString = nameString;

    }

 

    public String toString()

    {

        return "name:"+nameString+",age:"+age+",idnumber"+info.idnumber;

    }

 

    public Object clone()

    {

        Person person=null;

        try {

            person=(Person)super.clone(); //浅拷贝

            person.info=(Info)info.clone();//加上这一句就变成了深拷贝,对对象引用也进行一次拷贝

            } catch (CloneNotSupportedException e) {

            // TODO 自动生成的 catch 块

            e.printStackTrace();

            }

        return person;

    }

}

ログイン後にコピー

结果:

1

2

person2name:hello,age:20,idnumber200

person1name:tiantian,age:10,idnumber100

ログイン後にコピー

所有的值都进行了改变。

以上がJava クローン コード例の概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート