Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java对象#克隆行为?_Java_Clone - Fatal编程技术网

Java对象#克隆行为?

Java对象#克隆行为?,java,clone,Java,Clone,我正在测试Object#clone方法的行为,我不明白为什么下面的代码会打印true,Diego,Diego,我希望它会打印true,Diego,Armando,因为p.getName()==p2.getName()打印true。请任何人解释一下,如果p2.setName(“Armando”)指向同一个字符串,为什么它们不修改p对象?多谢各位 public class Main { public static void main(String[] args) { Person p =

我正在测试Object#clone方法的行为,我不明白为什么下面的代码会打印true,Diego,Diego,我希望它会打印true,Diego,Armando,因为p.getName()==p2.getName()打印true。请任何人解释一下,如果p2.setName(“Armando”)指向同一个字符串,为什么它们不修改p对象?多谢各位

public class Main {

public static void main(String[] args) {
    Person p = new Person();
    p.setName("Diego");
    Person p2 = null;
    try {
         p2 = (Person) p.clonar();
    } catch (CloneNotSupportedException e) {
        e.printStackTrace();
    }
    System.out.println(p.getName() == p2.getName());
    System.out.println(p.getName());
    p2.setName("Armando");
    System.out.println(p.getName());
}
}

class Person implements Cloneable {
private String name;

public Object clonar() throws CloneNotSupportedException {
    return this.clone();
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}
}

因为当时两个引用都指向同一个String对象。但是,当调用p2.setName时,p2的名称引用将指向另一个字符串对象。@dunni提供的答复

为了重现我想要的行为,我首先需要添加一个可变类,该类用作占位符(地址):

现在打印:

改革之路


lomas de chapultepec

您正在设置
p2
的名称,而不是
p
,因此名称不会更改…但据我所知,克隆方法会生成浅拷贝,因此两个对象都指向同一条字符串。对象不等于其克隆,因此
p2!=p
。因此,设置
p2
的名称不会影响
p
的名称。但是,当您调用p2.setName时,p2的名称引用会指向另一个String对象。
public class Main {

public static void main(String[] args) {
    Person p = new Person();
    Person p2 = null;
    Address address = new Address("paseo de la reforma");
    p.setAddress(address);

    try {
         p2 = (Person) p.clonar();
    } catch (CloneNotSupportedException e) {
        e.printStackTrace();
    }   
    p2.getAddress().setStreet("lomas de chapultepec");
    System.out.println(p.getAddress().getStreet());
}
}

class Address {
private String street;

public Address(String street) {
    this.street = street;
}

public String getStreet() {
    return street;
}

public void setStreet(String street) {
    this.street = street;
}

  }

class Person implements Cloneable {
private String name;
private Integer edad;
private int mes;
private Address address;

public Integer getEdad() {
    return edad;
}

public void setEdad(Integer edad) {
    this.edad = edad;
}

public int getMes() {
    return mes;
}

public void setMes(int mes) {
    this.mes = mes;
}

public Object clonar() throws CloneNotSupportedException {
    return this.clone();
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public Address getAddress() {
    return address;
}

public void setAddress(Address address) {
    this.address = address;
}
}