2015-05-23 36 views
0

我只是不明白爲什麼t.getName()是Keen如果t分配給你。不明白引用

public class StringProgram{ 
    public static void main(String[] args) { 


    Person t = new Person("Gene"); 
    Person u = t; 
    u.setName("Keen"); 

    System.out.println(t.getName());//Keen 
    System.out.println(t.equals(u));//true 


    } 
} 

Person類

public class Person{ 
    private String name; 

    public Person(String d){ 
    name=d; 
    } 
    public void setName(String a){ 
     name=a; 
    } 

    public String getName(){ 
     return name; 
    } 

    @Override 
    public boolean equals(Object o) { 
     if (!(o instanceof Person)) { 
      return false; 
     } 

     return ((Person) o).name.equals(this.name); 
    } 
} 

回答

1

正是像他們的評論上述user4932934。 注意該行:

Person t = new Person("Gene"); 

使用 「new」 關鍵字 - 它會告訴你創建新對象。 行:

Person u = t; 

簡單的 「T」 分配給 「U」。現在他們在內存中引用同一個對象,沒有創建Person的新實例。

1

Person u = t;使u表示與t完全相同的對象。相同的內存位置,如果有幫助。所以改變t的內容也會改變u的內容。因爲它們是同一個對象。

2

我也有點新,但我認爲這就是爲什麼它會打印出「Keen」。 這將需要進入java對象使用

首先,Person t=new Person("Gene")創建一個名稱變量「Gene」的人物對象。然後,它使用一個引用,在您的案例t中引用該對象。因此t將始終引用該Person對象。

然後,用你的下一行,Person u=t,你正在創建實際上指的是同一個Person對象與「基因」的原創t參考一個新的參考。使用=符號使它們做同樣的事情,參考「基因」,就像Java中數學操作的平等使左手等於右手一樣。

因此,無論您是使用u還是t來引用「基因」對象,您都指的是同樣的事情。因此,在u.setName("Keen")t.setName("Keen")中,您正在尋找內存中某處的相同對象,並在其中執行某些操作,在這種情況下,將name變量更改爲「Keen」。

1

我會與你分享我曾經閱讀的參考資料。

想象一下,您的Person對象是氣球。你的引用t是一個連接到氣球的字符串(繩索,而不是Java String)。

所以,當你創建另一個參考ü這同樣喜歡牛逼,您創建連接到一個相同的氣球(人)另一個字符串(繩)。

如果更改了氣球的屬性,例如顏色,u和t都會看到這個變化,因爲你只有一個氣球連接到u和t。

因此,當您將引用分配給另一個引用時,您並未創建新對象。