文章目录
什么是对象拷贝?对象的浅拷贝、对象的深拷贝?
对象的拷贝的说明
Java中的对象拷贝(Object Copy)指的是将一个对象的所有属性(成员变量)拷贝到另一个有着相同类类型的对象中去。
- 例:比如,对象A和对象B都属于类C,具有属性a和b。那么对对象A进行拷贝操作赋值给对象B就是:B.a=A.a; B.b=A.b;
拷贝对象,主要是为了在新的上下文环境中复用现有对象的部分或全部 数据。
Java中的对象拷贝主要分为:浅拷贝(Shallow Copy)、深拷贝(Deep Copy)。
铺垫知识:Java中的数据类型分为基本数据类型和引用数据类型。对于这两种数据类型,在进行赋值操作、用作方法参数或返回值时,会有值传递和引用(地址)传递的差别。
浅拷贝
浅拷贝(Shallow Copy)
- 对于基本数据类型的成员变量,浅拷贝进行的是值传递,也就是将对象A中的基本数据类型的成员变量的值赋值给对象B中的同等基本数据类型的成员变量。因为是两份不同的数据,所以对其中一个对象的该成员变量值进行修改,不会影响另一个对象拷贝得到的数据
- 对于数据类型是引用类型的成员变量,比如说成员变量是某个数组、某个类的对象等,那么浅拷贝会进行引用传递,也就是只是将该成员变量的引用值(内存地址)复制一份给新的对象。因为实际上两个对象的该成员变量都指向同一个实例。在这种情况下,在一个对象中修改该成员变量会影响到另一个对象的该成员变量值。
浅拷贝示例图:
以下两种方法实现浅拷贝
1.使用类的构造器实现浅拷贝
拷贝构造器指的是该类的构造器参数为该类的对象。使用拷贝构造器可以很好地完成浅拷贝,直接通过一个现有的对象创建出与该对象属性相同的新的对象。
代码:
public class ObjectShallowCopyByConstructor {
public static void main(String[] args) {
//**************通过类的构造器浅拷贝对象**************
Person personZhang = new Person("张三", 22, new Occupation("程序员",8000));
Person personLi = new Person(personZhang);
System.out.println("=====改变值前=====");
System.out.println(personZhang.getOccupation().hashCode());
System.out.println(personZhang);
System.out.println(personLi.getOccupation().hashCode());
System.out.println(personLi);
System.out.println("=====改变值后=====");
personZhang.setAge(30);
personZhang.setName("李四");
personZhang.getOccupation().setOccName("厨师"); //改变personZhang的Occupation的occName
System.out.println(personZhang.getOccupation().hashCode());
System.out.println(personZhang);
System.out.println(personLi.getOccupation().hashCode());
System.out.println(personLi);
}
}
class Person{
private String name;
private int age;
private Occupation occupation; //职业
public Person(){
}
public Person(String name, int age, Occupation occupation) {
this.name = name;
this.age = age;
this.occupation = occupation;
}
//拷贝构造器,用于拷贝对象
public Person(Person person) {
this.name = person.name;
this.age = person.age;
this.occupation = person.occupation;
}
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 Occupation getOccupation() {
return occupation;
}
public void setOccupation(Occupation occupation) {
this.occupation = occupation;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", occupation=" + occupation +
'}';
}
}
class Occupation{
private String occName;
private int salary;
public Occupation() {
}
public Occupation(String occName, int salary) {
this.occName = occName;
this.salary = salary