深拷贝与浅拷贝
浅拷贝:
创建一个新对象,然后将当前对象的非静态字段复制到该新对象,如果字段是值类型的,那么对该字段执行复制;如果该字段是引用类型的话,则复制引用但不复制引用的对象。因此,原始对象及其副本引用同一个对象。
深拷贝:
创建一个新对象,然后将当前对象的非静态字段复制到该新对象,无论该字段是值类型的还是引用类型,都复制独立的一份。当你修改其中一个对象的任何内容时,都不会影响另一个对象的内容。
clone() 方法
在 Java 中,无论是浅拷贝还是深拷贝,都需要实现 clone() 方法,来完成操作。
package theson;
import java.util.Objects;
public class Person implements Cloneable {
public String name;
public int age;
public Person() {
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
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 "Person{" +
"姓名='" + name + '\'' +
", 年龄=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age &&
name.equals(person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
public static void main(String[] args) throws CloneNotSupportedException {
Person p = new Person();
Person p1 = (Person) p.clone();
p.setName("张三");
p.setAge(15);
}
}