浅谈对java深拷贝与浅拷贝的理解
生活随笔
收集整理的這篇文章主要介紹了
浅谈对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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 08-合成模式Quarkus实现
- 下一篇: 思科2960接入华为S5130报错分析