Object的clone方法是protected修饰的本地方法,拷贝出来的对象属于浅拷贝。
什么是浅拷贝
创建一个新对象,然后将当前对象的非静态字段复制到该对象,如果字段类型是值类型(基本类型)的,那么对该字段进行复制;如果字段是引用类型的,则只复制该字段的引用而不复制引用指向的对象。此时新对象里面的引用类型字段相当于是原始对象里面引用类型字段的一个副本,原始对象与新对象里面的引用字段指向的是同一个对象。修改新对象的引用类型字段值,会改变被拷贝对象的引用字段的值
什么是深拷贝
即进行拷贝的时候,将引用类型的属性内容也拷贝一份新的。
clone方法使用
1、实现Cloneable接口
2、重写Object的clone,访问权限设置为public,然后在里面调用super.clone()
代码验证
浅拷贝:
public class Company implements Cloneable {
private String name;
private Employee employee;
public Company(String name, Employee employee) {
this.name = name;
this.employee = employee;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Employee getEmployee() {
return employee;
}
public void setEmployee(Employee employee) {
this.employee = employee;
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
@Override
public String toString() {
return "Company{" +
"name='" + name + '\'' +
", employee=" + employee +
'}';
}
}
public class Employee {
private String name;
private int age;
public Employee(String name, int age) {
this.name = name;
this.age = 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;
}
@Override
public String toString() {
return "Employee{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public static void main(String[] args) throws CloneNotSupportedException {
Employee employee = new Employee("zs",20);
Company company = new Company("tb",employee);
Company companyClone = (Company)company.clone();
System.out.println("******company hashCode:"+company.hashCode());
System.out.println("******companyClone hashCode:"+companyClone.hashCode());
System.out.println("******company:"+company);
companyClone.setName("jd");
companyClone.getEmployee().setName("ls");
companyClone.getEmployee().setAge(30);
System.out.println("******company:"+company);
}
运行结果:
深拷贝:
Employee添加clone方法并修改Company的clone方法:
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
@Override
public Object clone() throws CloneNotSupportedException {
Company clone = (Company) super.clone();
clone.setEmployee((Employee) getEmployee().clone());
return clone;
}
运行结果: