日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Java中的浅克隆与深克隆

發(fā)布時(shí)間:2024/1/1 java 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java中的浅克隆与深克隆 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Java中的淺克隆與深克隆

  • 一:前言
  • 二:淺克隆與深克隆的區(qū)別

一:前言

克隆,即復(fù)制一個(gè)對(duì)象,該對(duì)象的屬性與被復(fù)制的對(duì)象一致,如果不使用Object類中的clone方法實(shí)現(xiàn)克隆,可以自己new出一個(gè)對(duì)象,并對(duì)相應(yīng)的屬性進(jìn)行數(shù)據(jù)添加,這樣也能實(shí)現(xiàn)克隆的目的。

但當(dāng)對(duì)象屬性較多時(shí),這樣的克隆方式會(huì)比較麻煩,所以O(shè)bject類中實(shí)現(xiàn)了clone方法,用于克隆對(duì)象,Java中的克隆分為淺克隆與深克隆。

實(shí)現(xiàn)克隆的方式

1.對(duì)象的類需要實(shí)現(xiàn)Cloneable接口

2.重寫Object類中的clone()方法

3.根據(jù)重寫的clone()方法得到想要的克隆結(jié)果,例如淺克隆與深克隆。

二:淺克隆與深克隆的區(qū)別

淺克隆:復(fù)制對(duì)象時(shí)僅僅復(fù)制對(duì)象本身,包括基本屬性,但該對(duì)象的屬性引用其他對(duì)象時(shí),該引用對(duì)象不會(huì)被復(fù)制,即拷貝出來(lái)的對(duì)象與被拷貝出來(lái)的對(duì)象中的屬性引用的對(duì)象是同一個(gè)。

深克隆:復(fù)制對(duì)象本身的同時(shí),也復(fù)制對(duì)象包含的引用指向的對(duì)象,即修改被克隆對(duì)象的任何屬性都不會(huì)影響到克隆出來(lái)的對(duì)象。



例子如下:

class Person implements Cloneable{private int age;private String name;public Person(int age, String name) {this.age = age;this.name = name;}public void setAge(int age) {this.age = age;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Person{" +"age=" + age +", name='" + name + '\'' +'}';}@Overrideprotected Person clone() throws CloneNotSupportedException {return (Person)super.clone(); //調(diào)用父類的clone方法} }

測(cè)試代碼:

public class CloneTest {public static void main(String[] args) throws CloneNotSupportedException {Person person = new Person(22,"LiLei");Person newPerson = person.clone();person.setAge(21);person.setName("HanMeimei");System.out.println(person.toString());System.out.println(newPerson.toString());} }

測(cè)試結(jié)果:

Person{age=21, name='HanMeimei'} Person{age=22, name='LiLei'}

即在克隆出新的對(duì)象后,修改被克隆對(duì)象的基本屬性,并不會(huì)影響克隆出來(lái)的對(duì)象。但當(dāng)被克隆的對(duì)象的屬性引用其他對(duì)象時(shí),此時(shí)會(huì)有不同的結(jié)果。

例子如下:

/** * 學(xué)生類 */ class Student implements Cloneable{private String name;private Achievement achievement; //成績(jī)public Student(String name, Achievement achievement) {this.name = name;this.achievement = achievement;}public void setName(String name) {this.name = name;}public void setAchievement(Achievement achievement) {this.achievement = achievement;}public Achievement getAchievement() {return achievement;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", achievement=" + achievement +'}';}@Overrideprotected Student clone() throws CloneNotSupportedException {return (Student) super.clone();} }/** * 成績(jī)類 */ class Achievement implements Cloneable{private float Chinese;private float math;private float English;public Achievement(float chinese, float math, float english) {Chinese = chinese;this.math = math;English = english;}public void setChinese(float chinese) {Chinese = chinese;}public void setMath(float math) {this.math = math;}public void setEnglish(float english) {English = english;}@Overridepublic String toString() {return "Achievement{" +"Chinese=" + Chinese +", math=" + math +", English=" + English +'}';}@Overrideprotected Achievement clone() throws CloneNotSupportedException {return (Achievement) super.clone();} }

測(cè)試代碼:

public class CloneTest {public static void main(String[] args) throws CloneNotSupportedException {Achievement achievement = new Achievement(100,100,100);Student student = new Student("LiLei",achievement);// 克隆出一個(gè)對(duì)象Student newStudent = student.clone();// 修改原有對(duì)象的屬性student.setName("HanMeimei");student.getAchievement().setChinese(90);student.getAchievement().setEnglish(90);student.getAchievement().setMath(90);System.out.println(newStudent);System.out.println(student);} }

測(cè)試結(jié)果:

Student{name='LiLei', achievement=Achievement{Chinese=90.0, math=90.0, English=90.0}} Student{name='HanMeimei', achievement=Achievement{Chinese=90.0, math=90.0, English=90.0}}

以上現(xiàn)象表明,上述克隆方式為淺克隆,并不會(huì)克隆對(duì)象的屬性引用的對(duì)象,當(dāng)修改被克隆對(duì)象的成績(jī)時(shí),克隆出來(lái)的對(duì)象也會(huì)跟著改變,即兩個(gè)對(duì)象的屬性引用指向的是同一個(gè)對(duì)象。

但只要修改一下 Student 類中重寫的 clone() 方法,即可實(shí)現(xiàn)深克隆。

修改代碼如下:

@Override protected Student clone() throws CloneNotSupportedException {Student student = (Student) super.clone();Achievement achievement = student.getAchievement().clone();student.setAchievement(achievement);return student; }

測(cè)試結(jié)果:

Student{name='LiLei', achievement=Achievement{Chinese=100.0, math=100.0, English=100.0}} Student{name='HanMeimei', achievement=Achievement{Chinese=90.0, math=90.0, English=90.0}}

即在 Student 類中的 clone() 方法中再克隆一次 Achievement 對(duì)象,并賦值給 Student 對(duì)象。

值得一提的是,上文所說(shuō)的淺拷貝只會(huì)克隆基本數(shù)據(jù)屬性,而不會(huì)克隆引用其他對(duì)象的屬性,但 String 對(duì)象又不屬于基本屬性,這又是為什么呢?

這是因?yàn)?String 對(duì)象是不可修改的對(duì)象,每次修改其實(shí)都是新建一個(gè)新的對(duì)象,而不是在原有的對(duì)象上修改,所以當(dāng)修改 String 屬性時(shí)其實(shí)是新開辟一個(gè)空間存儲(chǔ) String 對(duì)象,并把引用指向該內(nèi)存,而克隆出來(lái)的對(duì)象的 String 屬性還是指向原有的內(nèi)存地址,所以 String 對(duì)象在淺克隆中也表現(xiàn)得與基本屬性一樣。

轉(zhuǎn)載自:https://mp.weixin.qq.com/s/I6Gq1shyfKigPp1_hyb0sg

總結(jié)

以上是生活随笔為你收集整理的Java中的浅克隆与深克隆的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。