2017-02-11 5 views
-1

私はObject#cloneメソッドの動作をテストしていますが、なぜ、次のコードがtrueを出力するのか理解できません。Diego、Diego、p.getName()== p2以降、Diego、Armandoが真であることを期待していました。 getName()はtrueを出力します。なぜ誰かがp2.setName( "Armando")が同じ文字列を指している場合、pオブジェクトを変更していないと説明できますか?ありがとうございました。Java Object#クローンの動作ですか?

+1

あなたは 'p2'、ない' p'の名前を設定しているので、名前が変更されていません... – Li357

+0

しかし、私はCを理解して唯一のメソッドは浅いコピーを作成するため、両方のオブジェクトが同じ文字列を指します –

+0

オブジェクトはそのクローンと等しくないので、 'p2!= p'です。したがって、 'p2'の名前を設定しても' p'の名前には影響しません。 – Li357

答えて

0

この時点では両方の参照が同じStringオブジェクトを指しているためです。ただし、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; 
} 
} 

この今版画:

パセオ・デ・ラ・@dunni

が提供する回答は、私は、私はプレースホルダ(アドレス)として働く可変クラスを追加する最初の必要たかった現象を再現しますレフォルマ

ロマスデチャプルテペック

関連する問題