日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

JAVA 對(duì)象拷貝

系統(tǒng) 2057 0

JAVA 對(duì)象拷貝

為什么需要有對(duì)象拷貝?

對(duì)象拷貝相對(duì)的自然是引用拷貝。java初學(xué)者經(jīng)常會(huì)問(wèn),我這個(gè)方法要改變一個(gè)對(duì)象的屬性,可以把參數(shù)傳進(jìn)去了,為什么沒(méi)有改變了?

——基本數(shù)據(jù)類型傳值,而對(duì)象傳引用或引用的拷貝。

而有時(shí)候我們要獲取到一個(gè)當(dāng)前狀態(tài)的對(duì)象復(fù)制品,他們是兩個(gè)獨(dú)立對(duì)象。不再是引用或者引用拷貝(實(shí)質(zhì)都是指向?qū)ο蟊旧恚>褪钦f(shuō)a是b的拷貝,b發(fā)生變化的時(shí)候,不要影響a。


對(duì)象拷貝有淺拷貝和深度拷貝兩種。

1)淺拷貝

淺拷貝是指對(duì)象中基本數(shù)據(jù)類型得到拷貝,而引用數(shù)據(jù)類型并未拷貝。
提到拷貝自然和clone聯(lián)系起來(lái)了,所有具有clone功能的類都有一個(gè)特性,那就是它直接或間接地實(shí)現(xiàn)了Cloneable接口。
否則,我們?cè)趪L試調(diào)用clone()方法時(shí),將會(huì)觸發(fā)CloneNotSupportedException異常。
eg:

?1 public ? class ?DOG? implements ?Cloneable
?2 {
?3 ???? public ?DOG(String?name,? int ?age)
?4 ???? {
?5 ???????? this .name? = ?name;
?6 ???????? this .age? = ?age;
?7 ????}

?8
?9 ???? public ?String?getName()
10 ???? {
11 ???????? return ? this .name;
12 ????}

13
14 ???? public ? int ?getAge()
15 ???? {
16 ???????? return ? this .age;
17 ????}

18
19 ???? public ?Object?clone()
20 ???? {
21 ???????? try
22 ???????? {
23 ???????????? return ? super .clone();
24
25 ????????}
? catch ?(CloneNotSupportedException?e)
26 ???????? {
27 ???????????? return ? null ;
28 ????????}

29 ????}

30
31 ???? public ?String?name;
32
33 ???? private ? int ?age;
34
35 ???? // test
36 ???? public ? static ? void ?main(String[]?args)
37 ???? {
38 ????????DOG?dog1? = ? new ?DOG( " xiaogou " ,? 2 );
39 ????????DOG?dog2? = ?(DOG)?dog1.clone();
40 ????????dog1.name? = ? " dagou " ;
41 ????????System.out.println(dog2.getName());
42 ????????System.out.println(dog2.getAge());
43 ????????System.out.println(dog1.getName());
44 ????????System.out.println(dog1.getAge());
45
46 ????}

47
48 }

49



運(yùn)行結(jié)果:

xiaogou
2
dagou
2

2)深度拷貝

相對(duì)淺拷貝。實(shí)現(xiàn)對(duì)象中基本數(shù)據(jù)類型和引用數(shù)據(jù)類型的拷貝。

請(qǐng)先看下面代碼:

?

?1 class ?AAA
?2 {
?3 ???? public ?AAA(String?name)
?4 ???? {
?5 ???????? this .name? = ?name;
?6 ????}

?7
?8 ???? public ?String?name;
?9 }

10
11 class ?DOG? implements ?Cloneable
12 {
13 ???? public ?DOG(String?name,? int ?age,?AAA?birthday)
14 ???? {
15 ???????? this .name? = ?name;
16 ???????? this .age? = ?age;
17 ???????? this .birthday? = ?birthday;
18 ????}

19
20 ???? public ?String?getName()
21 ???? {
22 ???????? return ?name;
23 ????}

24
25 ???? public ? int ?getAge()
26 ???? {
27 ???????? return ?age;
28 ????}

29
30 ???? public ?AAA?getBirthday()
31 ???? {
32 ???????? return ?birthday;
33 ????}

34
35 ???? public ?String?getBirth(AAA?a)
36 ???? {
37 ???????? return ?a.name;
38 ????}

39
40 ???? public ?String?name;
41
42 ???? private ? int ?age;
43
44 ???? public ?AAA?birthday;
45
46 ???? public ?Object?clone()
47 ???? {
48 ???????? try
49 ???????? {
50 ???????????? super .clone();
51 ???????????? return ? super .clone();
52 ????????}
? catch ?(Exception?e)
53 ???????? {
54 ???????????? return ? null ;
55 ????????}

56 ????}

57 }

58
59 public ? class ?TestClone
60 {
61 ???? public ? static ? void ?main(String[]?args)
62 ???? {
63 ????????AAA?Day? = ? new ?AAA( " test " );
64 ????????DOG?dog1? = ? new ?DOG( " xiaogou " ,? 2 ,?Day);
65 ????????DOG?dog2? = ?(DOG)?dog1.clone();
66 ???????? // ??dog2.birthday?=?(AAA)?dog1.birthday.clone();?
67 ????????dog1.birthday.name? = ? " 333 " ;
68 ????????System.out.println(dog1.getBirth(dog1.birthday));
69 ????????System.out.println(dog2.getBirth(dog2.birthday));
70 ????}

71 }

72


運(yùn)行結(jié)果是:
333
333
而真正要實(shí)現(xiàn)拷貝還的加點(diǎn)代碼,如下請(qǐng)對(duì)比上面和下面代碼的異同之處:

?1 class ?AAA? implements ?Cloneable
?2 {
?3 ???? public ?AAA(String?name)
?4 ???? {
?5 ???????? this .name? = ?name;
?6 ????}

?7
?8 ???? public ?Object?clone()
?9 ???? {
10 ???????? try
11 ???????? {
12 ???????????? super .clone();
13 ???????????? return ? super .clone();
14 ????????}
? catch ?(Exception?e)
15 ???????? {
16 ???????????? return ? null ;
17 ????????}

18 ????}

19
20 ???? public ?String?name;
21 }

22
23 class ?DOG? implements ?Cloneable
24 {
25 ???? public ?DOG(String?name,? int ?age,?AAA?birthday)
26 ???? {
27 ???????? this .name? = ?name;
28 ???????? this .age? = ?age;
29 ???????? this .birthday? = ?birthday;
30 ????}

colo
分享到:
評(píng)論

JAVA 對(duì)象拷貝


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 德清县| 乌兰察布市| 阳信县| 霍林郭勒市| 巴里| 璧山县| 睢宁县| 鞍山市| 思南县| 惠东县| 汤阴县| 阿瓦提县| 汉源县| 盐城市| 延津县| 尉犁县| 泗阳县| 无极县| 绥棱县| 鄂尔多斯市| 无锡市| 鹤壁市| 大厂| 铜山县| 拜泉县| 平度市| 沂水县| 平江县| 昭苏县| 泾阳县| 额济纳旗| 敦煌市| 永嘉县| 汉阴县| 贵州省| 沙坪坝区| 杨浦区| 蒲江县| 漯河市| 辉南县| 台南市|