Java 对象#clone 行为?
Java Object#clone behavior?
我正在测试 Object#clone 方法的行为,但我不明白为什么以下代码会打印 true, Diego, Diego,自从 p.getName( ) == p2.getName() 打印为真。谁能解释一下为什么 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 的名称引用将指向另一个 String 对象。 @dunni提供的答案
为了重现我想要的行为,我首先需要添加一个可变 class 作为占位符(地址):
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;
}
}
现在打印:
改革大道
查普尔特佩克洛马斯
我正在测试 Object#clone 方法的行为,但我不明白为什么以下代码会打印 true, Diego, Diego,自从 p.getName( ) == p2.getName() 打印为真。谁能解释一下为什么 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 的名称引用将指向另一个 String 对象。 @dunni提供的答案
为了重现我想要的行为,我首先需要添加一个可变 class 作为占位符(地址):
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;
}
}
现在打印:
改革大道
查普尔特佩克洛马斯