浅表克隆和深表克隆
一、为什么要用克隆
- 克隆的对象可能包含一些修改过的属性,而new出来的对象的属性都是初始化的值
- 速度快,clone方法最终将调用JVM中的原生方法完成复制
二、浅表克隆
User.class
package com.cqie.demo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Cloneable {
private int id;
private String name;
private int age;
private Birthday birthday;
@Override
protected Object clone() throws CloneNotSupportedException {
Object object = super.clone();
return object;
}
}
Birthday.class
package com.cqie.demo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Birthday {
private int year;
private int month;
private int day;
}
UserTest.class
package com.cqie.demo;
public class UserCloneTest {
public static void main(String[] args) throws CloneNotSupportedException {
User u1 = new User(2,"dj",18,new Birthday(2001,01,07));
System.out.println("u1---->"+u1);
System.out.println("u1对象的地址--->"+u1.hashCode());
System.out.println("u1对象的birthday属性指向Birthday对象的地址--->"+u1.getBirthday().hashCode());
User u2 = (User)u1.clone();
System.out.println("u2---->"+u2);
System.out.println("u2对象的地址--->"+u2.hashCode());
System.out.println("u2对象的birthday属性指向Birthday对象的地址--->"+u2.getBirthday().hashCode());
System.out.println("---------------------");
//克隆后得到的是一个新的对象,所以重新写的是u2这个对象的值
u2.setAge(23);
System.out.println("u1-age--->"+u1.getAge());
System.out.println("u2-age--->"+u2.getAge());
System.out.println("u1---->"+u1);
System.out.println("u1对象的地址--->"+u1.hashCode());
System.out.println(u1.getBirthday().hashCode());
System.out.println("重写后u2---->"+u2);
System.out.println("重写后u2对象的地址--->"+u2.hashCode());
System.out.println(u2.getBirthday().hashCode());
}
}
三、深表克隆
Teacher.class
package com.cqie.demo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Teacher implements Cloneable{
private int id;
private String name;
private int age;
private Birthday birthday;
public Teacher(int id, String name, int age,int year,int month,int day) {
this.id = id;
this.name = name;
this.age = age;
birthday = new Birthday(year,month,day);
}
public Teacher cloneByDeep(Birthday birthday) throws CloneNotSupportedException {
Teacher teacher = null;
teacher = (Teacher) this.clone();
teacher.setBirthday(birthday);
return teacher;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
TeacherCloneTest.class
package com.cqie.demo;
public class TeacherCloneTest {
public static void main(String[] args) throws CloneNotSupportedException {
Teacher teacher1 = new Teacher(101,"dy",30,1992,01,25);
Teacher teacher2 = (Teacher) teacher1.cloneByDeep(new Birthday(1993,01,25));
Teacher teacher3 = (Teacher)teacher1.clone();
System.out.println(teacher1);
System.out.println(teacher1.hashCode());
System.out.println(teacher2);
System.out.println(teacher2.hashCode());
System.out.println(teacher3);
System.out.println(teacher3.hashCode());
}
}