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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

浅谈对java深拷贝与浅拷贝的理解

發(fā)布時間:2023/12/29 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 浅谈对java深拷贝与浅拷贝的理解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

java中什么是淺拷貝?什么是深拷貝?

1.拷貝:實現(xiàn)對象復(fù)制的方式。
2.淺拷貝:被復(fù)制的對象的所有變量都含有原來對象相同的值,而所有的對其他對象的引用仍然指向原來的對象。換言之, 淺拷貝僅僅復(fù)制所考慮的對象,而不復(fù)制它所引用的對象。
3.深拷貝:被復(fù)制對象的所有變量都含有與原來對象相同的值,而那些引用對象的變量將指向被復(fù)制過的新對象,而不再是原有 的那些被引用的對象。換言之,深拷貝把要復(fù)制的對象所引用的對象都復(fù)制了一遍。

直接上代碼

1.簡單的引用賦值

/*** 定義一個U類,同時實現(xiàn)Cloneable接口,重新clone方法* U類只包含一個域 address*/ @AllArgsConstructor @Data class U implements Cloneable{private String address;@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();} }/*** 定義一個User類,也實現(xiàn)Cloneable接口,同時重新clone方法* User類包含兩個基本類型域,和一個引用類型域 u*/ @Data @AllArgsConstructor class User implements Cloneable {private String name;private Integer age;private U u;@Overridepublic User clone() throws CloneNotSupportedException {return (User)super.clone();} }/*** 簡單引用賦值* 效果:* *通過user引用對User對象做的操作也會影響到user1引用所指向的對象,* 因為user與user1兩個引用指向同一個User對像*/@Testpublic void t1() {User user = new User("user", 30,new U("成都"));User user1 = user;//兩個引用操作的都是同一個對象user.setAge(18);System.out.println(user);//User(name=wsm, age=18, u=U(address=成都))System.out.println(user1);//User(name=wsm, age=18, u=U(address=成都))}

2.克隆—淺拷貝

/*** 克隆---淺拷貝* 效果:user與user1指向兩個User對象,但是兩對象中的u引用指向同一個U對象* 基本數(shù)據(jù)類型可以分離,但是引用類型還是指向同一個對象** 注意:返回值中u的address域都是返回的“成都”**/@Testpublic void t2() throws CloneNotSupportedException {User user = new User("user", 30,new U("北京"));User user1 = user.clone();//改變基本數(shù)據(jù)類型user1.setAge(20);//改變引用類型 雖然修改的user1 但是user也改變了user1.getU().setAddress("成都");System.out.println("user="+user);//user=User(name=user, age=30, u=U(address=成都))System.out.println("user1="+user1);//user1=User(name=user, age=20, u=U(address=成都))}

3.克隆—深拷貝

@Data @AllArgsConstructor class Person implements Cloneable {private String name;private Integer age;private U u;/*** 如果U對象中又存在引用對象k,則K類也需要做深度拷貝* 所以問題就是深度拷貝很繁重,后期可以通過序列化來優(yōu)化** 注意:Object.clone方法是protected的,而且返回值是Object* 我們在重寫clone方法時,將其改為public,同時返回我們需要的類型Person* @return* @throws CloneNotSupportedException*/@Overridepublic Person clone() throws CloneNotSupportedException {//拷貝 基本類型Person person=(Person)super.clone();//深度拷貝U對象person.u=(U)u.clone();return person;} }/*** 克隆---深拷貝 效果: user和user1指向兩個User對象,同時兩對象中的u引用也指向兩U對象* 實現(xiàn)原理查看Person.clone()** @throws CloneNotSupportedException*/@Testpublic void t3() throws CloneNotSupportedException {Person person = new Person("www", 20, new U("南京"));Person person1 = person.clone();person1.setAge(60);person.getU().setAddress("成都");System.out.println(person);//Person(name=www, age=20, u=U(address=成都))System.out.println(person1);//Person(name=www, age=60, u=U(address=南京))}

以上就是對java對象拷貝的簡單認識,如有不足之處,歡迎大家指點。
以上代碼將提交到碼云地址
搬磚老王.

總結(jié)

以上是生活随笔為你收集整理的浅谈对java深拷贝与浅拷贝的理解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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