有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java对象#克隆行为?

我正在测试Object#clone方法的行为,我不明白为什么下面的代码会打印true,Diego,Diego,我本来希望它打印true,Diego,Armando,因为p.getName()==p2。getName()打印为true。请任何人解释一下为什么。如果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;
}
}

共 (1) 个答案

  1. # 1 楼答案

    因为当时两个引用都指向同一个字符串对象。但是当你打电话给p2时。setName,p2的名称引用指向另一个字符串对象。答案由@dunni提供

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

    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;
    }
    }
    

    现在打印:

    改革之路

    洛马斯德查普特佩克酒店