前言
面试三连问: 1.你知道什么是深克隆和浅克隆吗? 2.深克隆是怎么实现的? 3.为什么要用深克隆? 有很多人都知道这个是什么但是却不知道怎么做实现?为什么要用深克隆也不清楚,接下来让我们进入这个深克隆与浅克隆的学习吧,早日吊打面试官!
1、深克隆和浅克隆是什么
- 深克隆:拷贝对象本身,而且拷贝对象包含的引用指向的所有对象
- 浅克隆:拷贝对象时仅仅拷贝对象本身(包括对象中的基本变量),而不拷贝对象包含的引用指向的对象。
2、怎么实现克隆
2.1浅克隆
- 对象实现Cloneable的接口
- 覆盖父类的clone方法
- 在clone方法中添加super.clone
代码如下(示例):
public class Person implements Cloneable,Serializable{
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private String name;
public Person(int age,String name){
this.age = age;
this.name = name;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
@Override
public String toString() {
return "Person age:"+age+" name:"+name;
}
public static void main(String[] args) throws Exception{
Person p = new Person(20,"李四");
Person p1 = (Person) p.clone();
p1.setAge(21);
System.out.println(p.toString());
System.out.println(p1.toString());
}
}
复制代码
上面只是实现了浅克隆,对于深克隆还要实现克隆的类和类中所有非基本数据类型的属性对应的类
2.2深克隆
代码如下(示例):
public class Person implements Cloneable,,Serializable{
private int age;
private String name;
private Student student;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
public Person(int age,String name){
this.age = age;
this.name = name;
}
@Override
protected Object clone() throws CloneNotSupportedException {
Person p = (Person) super.clone();
p.setStudent((Student) p.getStudent().clone());
return p;
}
@Override
public String toString() {
return "Person age:"+age+" name:"+name+ " "+student.toString();
}
public static void main(String[] args) throws Exception{
Student s = new Student();
s.setAge(11);
s.setName("lengj");
Person p = new Person(20,"李四");
p.setStudent(s);
Person p1 = (Person) p.clone();
p1.setAge(22);
p1.setName("张三");
Student s1 = new Student();
s1.setAge(12);
s1.setName("kdd");
p1.setStudent(s1);
System.out.println(p.toString());
System.out.println(p1.toString());
}
}
复制代码
public class Student implements Cloneable,Serializable{
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
@Override
public String toString() {
return "Student["+age+": name:"+name+"]";
}
复制代码
3.为什么要使用深克隆
克隆的对象可能包含一些已经修改过的属性,保留着你想克隆对象的值,而new出来的对象的属性全是一个新的对象,对应的属性没有值,所以我们还要重新给这个对象赋值。即当需要一个新的对象来保存当前对象的“状态”就靠clone方法了。