【137期】面試官:?jiǎn)桙c(diǎn)兒基礎(chǔ)的,你能說說Java深拷貝和淺拷貝區(qū)別嗎
閱讀本文大概需要 4 分鐘。
作者:riemann
blog.csdn.net/riemann_/article/details/87217229
一、拷貝的引入
(1)、引用拷貝
創(chuàng)建一個(gè)指向?qū)ο蟮囊米兞康目截悺?/p>
Teacher?teacher?=?new?Teacher("Taylor",26);
Teacher?otherteacher?=?teacher;
System.out.println(teacher);
System.out.println(otherteacher);
blog.Teacher@355da254
blog.Teacher@355da254

(2)、對(duì)象拷貝
Teacher?teacher?=?new?Teacher("Swift",26);?
Teacher?otherteacher?=?(Teacher)teacher.clone();?
System.out.println(teacher);
System.out.println(otherteacher);
blog.Teacher@355da254
blog.Teacher@4dc63996

注:深拷貝和淺拷貝都是對(duì)象拷貝
二、淺拷貝
(1)、定義
(2)、淺拷貝實(shí)例
package?com.test;
public?class?ShallowCopy?{
????public?static?void?main(String[]?args)?throws?CloneNotSupportedException?{
????????Teacher?teacher?=?new?Teacher();
????????teacher.setName("riemann");
????????teacher.setAge(27);
????????Student2?student1?=?new?Student2();
????????student1.setName("edgar");
????????student1.setAge(18);
????????student1.setTeacher(teacher);
????????Student2?student2?=?(Student2)?student1.clone();
????????System.out.println("拷貝后");
????????System.out.println(student2.getName());
????????System.out.println(student2.getAge());
????????System.out.println(student2.getTeacher().getName());
????????System.out.println(student2.getTeacher().getAge());
????????System.out.println("修改老師的信息后-------------");
????????//?修改老師的信息
????????teacher.setName("Games");
????????System.out.println(student1.getTeacher().getName());
????????System.out.println(student2.getTeacher().getName());
????}
}
class?Teacher?implements?Cloneable?{
????private?String?name;
????private?int?age;
????public?String?getName()?{
????????return?name;
????}
????public?void?setName(String?name)?{
????????this.name?=?name;
????}
????public?int?getAge()?{
????????return?age;
????}
????public?void?setAge(int?age)?{
????????this.age?=?age;
????}
}
class?Student2?implements?Cloneable?{
????private?String?name;
????private?int?age;
????private?Teacher?teacher;
????public?String?getName()?{
????????return?name;
????}
????public?void?setName(String?name)?{
????????this.name?=?name;
????}
????public?int?getAge()?{
????????return?age;
????}
????public?void?setAge(int?age)?{
????????this.age?=?age;
????}
????public?Teacher?getTeacher()?{
????????return?teacher;
????}
????public?void?setTeacher(Teacher?teacher)?{
????????this.teacher?=?teacher;
????}
????public?Object?clone()?throws?CloneNotSupportedException?{
????????Object?object?=?super.clone();
????????return?object;
????}
}
拷貝后
edgar
18
riemann
27
修改老師的信息后-------------
Games
Games

三、深拷貝
(1)、定義
(2)、深拷貝實(shí)例
package?com.test;
public?class?DeepCopy?{
????public?static?void?main(String[]?args)?throws?CloneNotSupportedException?{
????????Teacher2?teacher?=?new?Teacher2();
????????teacher.setName("riemann");
????????teacher.setAge(27);
????????Student3?student1?=?new?Student3();
????????student1.setName("edgar");
????????student1.setAge(18);
????????student1.setTeacher(teacher);
????????Student3?student2?=?(Student3)?student1.clone();
????????System.out.println("拷貝后");
????????System.out.println(student2.getName());
????????System.out.println(student2.getAge());
????????System.out.println(student2.getTeacher().getName());
????????System.out.println(student2.getTeacher().getAge());
????????System.out.println("修改老師的信息后-------------");
????????//?修改老師的信息
????????teacher.setName("Games");
????????System.out.println(student1.getTeacher().getName());
????????System.out.println(student2.getTeacher().getName());
????}
}
class?Teacher2?implements?Cloneable?{
????private?String?name;
????private?int?age;
????public?String?getName()?{
????????return?name;
????}
????public?void?setName(String?name)?{
????????this.name?=?name;
????}
????public?int?getAge()?{
????????return?age;
????}
????public?void?setAge(int?age)?{
????????this.age?=?age;
????}
????public?Object?clone()?throws?CloneNotSupportedException?{
????????return?super.clone();
????}
}
class?Student3?implements?Cloneable?{
????private?String?name;
????private?int?age;
????private?Teacher2?teacher;
????public?String?getName()?{
????????return?name;
????}
????public?void?setName(String?name)?{
????????this.name?=?name;
????}
????public?int?getAge()?{
????????return?age;
????}
????public?void?setAge(int?age)?{
????????this.age?=?age;
????}
????public?Teacher2?getTeacher()?{
????????return?teacher;
????}
????public?void?setTeacher(Teacher2?teacher)?{
????????this.teacher?=?teacher;
????}
????public?Object?clone()?throws?CloneNotSupportedException?{
????????//?淺復(fù)制時(shí):
????????//?Object?object?=?super.clone();
????????//?return?object;
????????//?改為深復(fù)制:
????????Student3?student?=?(Student3)?super.clone();
????????//?本來是淺復(fù)制,現(xiàn)在將Teacher對(duì)象復(fù)制一份并重新set進(jìn)來
????????student.setTeacher((Teacher2)?student.getTeacher().clone());
????????return?student;
????}
}
拷貝后
edgar
18
riemann
27
修改老師的信息后-------------
Games
riemann

推薦閱讀:
【136期】你能談?wù)凧ava中 synchronized 對(duì)象鎖和類鎖的區(qū)別
【135期】談?wù)凪ySQL中的重做日志,回滾日志,以及二進(jìn)制日志的區(qū)別及各自作用
【134期】面試官:你知道 Redis 內(nèi)部是怎么實(shí)現(xiàn)它的字符串的么?
微信掃描二維碼,關(guān)注我的公眾號(hào)
朕已閱?

