用Java克隆

时间:2018-10-23 11:11:10

标签: java clone cloneable

class Person implements Cloneable {

    String firstName;

    public String getFirstName() {
        return firstName;
     }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public Person clone() throws CloneNotSupportedException {
            return (Person) super.clone();
        }
   }

    Person p1 = new Person();
    p1.setFirstName("P1 Sara");

    Person p3 = new Person();
    try {
        p3 = (Person) p1.clone();
    } catch (CloneNotSupportedException e) {
    }

    p3.setFirstName("cloned Sara");
    System.out.println("P3 : " + p3.getFirstName());
    System.out.println("P1: " + p1.getFirstName());

我已经阅读到clone()方法实际上是一个浅表复制。 因此,我假设当P3中的一个字段的值更改时,P1中的一个字段也将更改。 但是,那没有发生。 我在这里想念什么?

1 个答案:

答案 0 :(得分:1)

clone()方法 实际上是浅表复制。
这是您的示例中发生的情况:

  1. person1引用了name。我们将此引用称为A。引用A指向堆内存中的某个位置。
  2. 将person1复制到person3之后,person3中的名称引用(简称为引用B)指向堆内存中的同一位置。 但参考文献不同。这是2个指向堆内存中相同位置的不同引用。
  3. 调用p3.setFirstName("cloned Sara")时,引用B会更新以指向堆内存中的另一个位置。没有理由改变参考A指向的位置的值。