2009-10-26 40 views
4

我想做一個包含不同對象的列表。在Java中的對象列表

List<Object> list = new ArrayList<Object>(); 
    defObject defObj; 
    optObject optObj; 

和defObject只有一個字符串屬性。

public static class defObject 
{ 
    public static String defObj; 

    public defObject(String x) 
    { 
     setDefObj(x);   
    } 

    public static String getDefObj() { 
     return defObj; 
    } 

    public static void setDefObj(String defObj) { 
     defObject.defObj = defObj; 
    }   
} 

,如果我多defObjects添加到列表中,並瀏覽清單,我做了後加入它們都包含相同的字符串,這是最後defObject的添加到列表中的元素。

我在做這樣的事情的對象添加到列表:

if (whatever) 
     list.add(defObj = new defObject("x")); 
    else if(whatever) 
     list.add(defObj = new defObject("y")); 

和結果是兩個defObjects與「Y」

字符串請幫我找出爲什麼對象未被正確添加,屬性與添加到列表中的最後一個defObj完全相同。

+8

類名應該大寫。 – 2009-10-26 04:28:35

回答

12

問題是defObjstatic所以所有的實例都共享相同的變量。從班級中的任何地方刪除單詞static,並且所有內容都可能按照您的預期工作。

3

String defObj變量是靜態的,所以對於defObject的所有實例它總是相等的。在你的方法和屬性聲明之前刪除「static」,它應該工作。

3

替換:

public static class defObject 
{ 
    public static String defObj; 
    ... 

有了:

public static class defObject 
{ 
    public String defObj; 
.... 

甚至更​​好:

public class DefObject { 
    private String defObj; 
    .... 

使用關鍵字static會使屬性或方法的class方法,這意味着所有實例只會有一個。

將其從您的代碼中刪除。另請注意,按照慣例,Java中的類名以大寫字母開頭,並且左大括號在同一行中。

+1

我給你的名字以大寫字母開頭,但是不要打開大括號應該在同一行 - 這是一個非常主觀的。 – 2009-10-26 05:04:52

+0

很多開發者都將自己的大括號放在自己的路線上。 – 2009-10-26 05:28:46

+0

@non sequitor:是的,這是非常主觀的,但事實證明,主要編程語言是Java的開發人員可以做到這一點。我寧願閱讀代碼,看起來像你在這種情況下Java的目標。我對C#也做了同樣的事情,我在它自己的行中使用了大括號,因爲這是大多數C#開發人員所做的。 – OscarRyz 2009-10-26 16:26:51

0

您從public static String defObj;static後,使其private你還需要從方法簽名刪除staticstatic方法不能從靜態上下文訪問實例變量即defObject.getDefObj()不能因爲訪問實例變量defObj編譯器不能確保它已經存在 - 沒有實例被實例化,因此沒有實例變量。這隻能通過類加載的static屬性完成。