Java中對(duì)Clone的理解

在面試中大家可能會(huì)被問(wèn)到關(guān)于Clone的相關(guān)知識(shí)风题,經(jīng)過(guò)分析和研究總算把Clone理解了。不過(guò)只是個(gè)人的觀點(diǎn)晌砾,大家不喜歡千萬(wàn)別噴攀甚。那我們來(lái)看一下平時(shí)的工作中Clone機(jī)制是如何工作的?

1. Clone和Copy

假設(shè)現(xiàn)在有一個(gè)User對(duì)象馁启,User u1=new User(“U1001”,“Jason”,25)驾孔,通

常我們會(huì)有這樣的賦值User u2=u1,這個(gè)時(shí)候只是簡(jiǎn)單了copy了一下reference惯疙,u2和u1都指向內(nèi)存中同一個(gè)object翠勉,這樣u2或者u1的一個(gè)操作都可能影響到對(duì)方。打個(gè)比方霉颠,如果我們通過(guò)u2.setAge()方法改變了Age域的值对碌,那么u1通過(guò)getAge()方法得到的就是修改之后的Age域的值,顯然這不是我們?cè)敢饪吹降妮镔恕N覀兿M玫絬1的一個(gè)精確拷貝朽们,同時(shí)兩者互不影響,這時(shí)候我們就可以使用Clone來(lái)滿足我們的需求诉位。User u2=u1.clone()骑脱,這時(shí)會(huì)生成一個(gè)新的User對(duì)象,并且和u1具有相同的屬性值和方法苍糠。

2. Shallow Clone和Deep Clone

Clone是如何完成的呢叁丧?Object在對(duì)某個(gè)對(duì)象實(shí)施Clone時(shí)對(duì)其是一無(wú)所知的,它僅僅是簡(jiǎn)單地執(zhí)行域?qū)τ虻腸opy岳瞭,這就是Shallow Clone拥娄。這樣,問(wèn)題就來(lái)了咯瞳筏,以User為例条舔,它里面有一個(gè)域birthday不是基本型別的變量,而是一個(gè)reference變量乏矾,經(jīng)過(guò)Clone之后就會(huì)產(chǎn)生一個(gè)新的Date型別的reference孟抗,它和原始對(duì)象中對(duì)應(yīng)的域指向同一個(gè)Date對(duì)象,這樣克隆類(lèi)就和原始類(lèi)共享了一部分信息钻心,而這樣顯然是不利的凄硼,過(guò)程下圖所示:

這個(gè)時(shí)候我們就需要進(jìn)行deep Clone了,對(duì)那些非基本型別的域進(jìn)行特殊的處理捷沸,例如本例中的birthday摊沉。我們可以重新定義Clone方法,對(duì)birthday做特殊處理痒给,如下代碼所示:


3. Clone()方法的保護(hù)機(jī)制在Object中Clone()是被申明為protected的说墨,這樣做是有一定的道理的骏全,以User類(lèi)為例,通過(guò)申明為protected尼斧,就可以保證只有User類(lèi)里面才能“克隆”User對(duì)象姜贡,原理可以參考我前面關(guān)于public、protected棺棵、private的學(xué)習(xí)筆記楼咳。

4. Clone()方法的使用Clone()方法的使用比較簡(jiǎn)單,注意如下幾點(diǎn)即可:a. 什么時(shí)候使用shallow Clone烛恤,什么時(shí)候使用deep Clone母怜,這個(gè)主要看具體對(duì)象的域是什么性質(zhì)的,基本型別還是reference variableb. 調(diào)用Clone()方法的對(duì)象所屬的類(lèi)(Class)必須implements Clonable接口缚柏,否則在調(diào)用Clone方法的時(shí)候會(huì)拋出CloneNotSupportedException苹熏。

每個(gè)人的理解不一樣但是本質(zhì)是不變的,我們還是要不斷的去學(xué)習(xí)新的java只是币喧,那么好了轨域,免費(fèi)分享java學(xué)習(xí)的資料,需要的可以來(lái)加我微信領(lǐng)攘蝗瘛:tangniu520666,備注“4”扛邑,都是最新的怜浅,有需要的朋友可以來(lái)騷擾我。主要還是能過(guò)快速的學(xué)習(xí)java蔬崩,能夠趕上最后一班java學(xué)習(xí)IDE快車(chē)恶座。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市沥阳,隨后出現(xiàn)的幾起案子跨琳,更是在濱河造成了極大的恐慌,老刑警劉巖桐罕,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脉让,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡功炮,警方通過(guò)查閱死者的電腦和手機(jī)溅潜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)薪伏,“玉大人滚澜,你說(shuō)我怎么就攤上這事〖藁常” “怎么了设捐?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵借浊,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我萝招,道長(zhǎng)蚂斤,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任即寒,我火速辦了婚禮橡淆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘母赵。我一直安慰自己逸爵,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布凹嘲。 她就那樣靜靜地躺著师倔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪周蹭。 梳的紋絲不亂的頭發(fā)上趋艘,一...
    開(kāi)封第一講書(shū)人閱讀 51,155評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音凶朗,去河邊找鬼瓷胧。 笑死,一個(gè)胖子當(dāng)著我的面吹牛棚愤,可吹牛的內(nèi)容都是我干的搓萧。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼宛畦,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼瘸洛!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起次和,我...
    開(kāi)封第一講書(shū)人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤反肋,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后踏施,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體石蔗,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年畅形,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了抓督。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡束亏,死狀恐怖铃在,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤定铜,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布阳液,位于F島的核電站,受9級(jí)特大地震影響揣炕,放射性物質(zhì)發(fā)生泄漏帘皿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一畸陡、第九天 我趴在偏房一處隱蔽的房頂上張望鹰溜。 院中可真熱鬧,春花似錦丁恭、人聲如沸曹动。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)墓陈。三九已至,卻和暖如春第献,著一層夾襖步出監(jiān)牢的瞬間贡必,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工庸毫, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留仔拟,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓飒赃,卻偏偏與公主長(zhǎng)得像利花,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子盒揉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 11.Override clone judiciously 大意為 明智地重寫(xiě)clone方法 說(shuō)到clone方法晋被,...
    Mezereon閱讀 808評(píng)論 0 3
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法兑徘,類(lèi)相關(guān)的語(yǔ)法刚盈,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法挂脑,異常的語(yǔ)法藕漱,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,623評(píng)論 18 399
  • Object類(lèi)是Java中其他所有類(lèi)的祖先,沒(méi)有Object類(lèi)Java面向?qū)ο鬅o(wú)從談起崭闲。作為其他所有類(lèi)的基類(lèi)肋联,Ob...
    時(shí)待吾閱讀 474評(píng)論 0 1
  • 個(gè)人筆記,方便自己查閱使用 Contents Java LangAssignment, ReferenceData...
    freenik閱讀 1,382評(píng)論 0 6
  • 昨晚室友跑來(lái)我房間刁俭,說(shuō)這個(gè)公司待不下去了了橄仍。 我心里有些慌,卻不知道怎么安慰她。聽(tīng)到她似是自言自語(yǔ)的話侮繁,”待個(gè)一年...
    秋落巴士閱讀 145評(píng)論 0 1