2017-02-11 174 views
-1

我正在測試對象#克隆方法的行爲,我不明白爲什麼下面的代碼打印真實,迭戈,迭戈,我期待它打印真正的迭戈,阿曼多自p.getName()== p2。 getName()打印真實。任何人都可以請任何人解釋爲什麼p2.setName(「Armando」)不修改p對象,如果他們指向相同的字符串?謝謝。Java對象#克隆行爲?

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

您設置的'p2',不'p'的名稱,這樣的名字沒有改變... – Li357

+0

但正如我理解C單獨的方法使淺拷貝,因此兩個對象指向相同的字符串 –

+0

一個對象不等於它的克隆,所以'p2!= p'。因此,設置'p2'的名字不會影響'p'的名字。 – Li357

回答

0

因爲當時兩個引用都指向同一個String對象。但是,當您調用p2.setName時,p2的名稱引用將指向另一個String對象。通過@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; 
} 
} 

這現在的打印效果:

的Paseo de la雷福馬

洛馬斯 - 查普爾特佩克