2011-11-07 48 views
0

我正面臨着java類的一些問題。java類和用於插入名稱的循環

這裏是我定義

public class Condutor { 
    private String name; 

    public Condutor(){ 
      name = ""; 
    } 

    public Condutor(String aName){ 
      this.name = aName; 
    } 

    public void setName(String aName){ 
      name = aName; 
    } 

    public String getName(){ 
      return name; 
    } 

    @Override 
    public String toString(){ 
     return name; 
    } 

} 

,並在主要的一類我有這個

public static void main(String[] args) { 
    Condutor[] names = new Condutor[10]; 
    Condutor name = new Condutor(); 
    String aName = ""; 

    for (int i = 0; i < 2; i++){ 
     aName = "Mike" + i; 

     name = new Condutor(aName); 
     names[i] = name; 

    } 
    for (int i = 0; i < 10;i++){ 
     System.out.println(names[i]); 
    } 

} 

可正常工作的印刷本: Mike0 Mike1 空 空 空 空 null null null 空

保持相同的類,但通過

 name.setName(aName); 
     names[i] = name; 
     System.out.println("------"); 
     System.out.println(names[i]); 
     System.out.println("------"); 

它打印

------ 
    Mike0 
    ------ 
    ------ 
    Mike1 
    ------ 
    Mike1 
    Mike1 
    null 
    null 
    null 
    null 
    null 
    null 
    null 
    null 

改變

 name = new Condutor(aName); 
     names[i] = name; 

我可以看到,在環路一切正常,但名字陣列在前兩個位置存儲最後一個輸入。

爲什麼會發生這種情況? 不應該像循環一樣存儲?

問候,

Favolas

回答

1

您需要在第二種情況下,以創建新的對象太:

name = new Condutor(); //add this line to make sure you create new object in every iteration 
name.setName(aName); 
names[i] = name; 
System.out.println("------"); 
System.out.println(names[i]); 
System.out.println("------"); 
+0

謝謝。現在我明白了,做你說的解決了問題 – Favolas

3

這是因爲只有一個Condutor是有史以來,它在兩個加入的[0]和[1]的位置。

對於i = 1時,改變它在被反射的名稱既[0]和[1]位置

+0

謝謝。現在我明白了 – Favolas

1

因爲在第二不準備創建Condutor的新實例。您每次都使用相同的實例。

Condutor[] names = new Condutor[10]; 
Condutor name = new Condutor(); // this is the one that is being used. 
+0

謝謝。現在我明白了 – Favolas

0

當你

names[i] = name; 

不是抄襲對象name下,但你只是複製參考把它變成names[i]。請注意,更改之後,您絕不會創建Conductor的任何實例,而不是main的第二行上創建的實例。還要注意,name始終是指在main的第二行中創建的同一個實例。因此,當你做

name.setName(aName); 

你重複設置同一個對象的名稱。你也拷貝基準(不是對象)的陣列的第一和第二元件:

names[i] = name; 

最終,僅存在一個Conductor已經有其名稱更新兩次(在第一循環)並且其參考被存儲在name,names[0]names[1]中。這解釋了輸出。

+0

謝謝。現在我明白了。你讓它變得簡單易懂。 – Favolas

1

在你的第一版本,你在第一循環的每個迭代創建一個單獨的實例。這樣,每個「導演」都會保留他的個人名字。

然而,在第二個版本中,您正在分配並因此在每次迭代中重複使用相同的Condutor實例(在main()的第2行中創建的實例),只更改此一個對象的名稱。因此,在打印結果時,您只能看到該單個對象的名稱,它最後如何設置。

+0

謝謝。現在我明白了 – Favolas