2013-07-08 53 views
0

我有幾個使用以下類的Java Object(同一個超類的所有部分)。如何在列表中存儲多個對象類的多個實例

對象類之一:

Class one extends Superobject { 
    int no; 
    int i; 
    String s; 
} 

對象的兩個類:

Class two extends Superobject { 
    int no; 
    int i; 
    String s; 
} 

我想讀取文本文件並調用構造函數Object一個後Object兩到創建許多對象每一個字。

我試過在super類中存儲list中的所有Object s,但不知何故,我無法讓列表成爲非靜態的。

Class Superobject { 
    int no; 
    int i; 
    String s; 
    List<Superobject> li; // of course, when called with the 
    //method below: static List<Superobject> li 
    } 

當我嘗試Object s添加到列表中,日食喊叫說li要作出static

public static void somemethod(Object one[] ones) { 
    for (one o : ones) { 
     li.add(o); 
    } 
} 

有沒有辦法讓它非靜態,或是否有更好的方式來存儲Object S'

+0

學習縮進代碼 –

+1

如果你還顯示你的方法聲明,會更好。 –

+1

@GrijeshChauhan看起來像是OP的問題,學習頁面中的格式代碼。 –

回答

0

非靜態方法與類的實例相關聯,而靜態方法與類本身相關聯。您正嘗試從靜態方法訪問非靜態成員。 因此,編譯器不能將非靜態成員與任何對象相關聯。

你可以做的是讓它們都是靜態的,你應該試着在列表中保存Superobject的幾個實例。如果你不把它設爲靜態,那麼Superobject的每個實例都會有自己的列表。 或者您可以創建一個單獨的類並將其稱爲SuperobjectCollection,並提供諸如添加,刪除,獲取等方法來訪問基礎列表。

考慮以下僞

class SuperobjectCollection { 
private List<Superobject> list; 

    public AddObj(Superobject obj) { 
    list.add(obj); 
    } 
} 

爲你添加,檢索或刪除對象的過程中看到可以添加任何邏輯。

如果您想保留Superobject類中的列表,您必須將其設置爲靜態,並使用靜態方法訪問它。如果你創建兩個實例像

Class Superobject { 
    int no; 
    int i; 
    String s; 
    List<Superobject> li; 
    } 

Superobject a = new one(); 
Superobject b = new two(); 

兩個ab將包含如果你不這樣做(如您已提供的代碼),您將有以下情況單獨li。如果您somemethod是非靜態的你就可以訪問此列表中該方法類似

li.add(); 

或類似

this.li.add(); 

這裏this要麼反對a如果你叫喜歡a.somemethod()b的方法,如果您稱之爲b.somemethod()

靜態方法與類不是實例相關聯,因此您可以像這樣訪問它:

Superobject.someobject(); 

不喜歡

a.someobject(); 
+0

但是,我仍然需要首先將'one'和'two'的實例存儲在列表中,對吧?集合類將接收到它的構造函數列表? – user2336713

+0

你需要明白,如果你在superobject類中定義了一個列表,它將只屬於那個類的實例。如果您創建了superobject的新實例或其任何派生類,它將創建一個新列表。如果你想保存superobject及其派生類的實例,那麼你必須使該列表成爲靜態的,並使用靜態函數(如果它是私有的)訪問它,或創建一個獨立的類,作爲我建議的集合。 – ata

+0

好的,謝謝你的詳細解釋。 – user2336713

1

看來你試圖從static方法somemethod訪問您的非靜態成員l。您需要將somemethod更改爲非靜態,或者將lstatic更改爲非靜態。

+0

這就是我想要的,但我不能使'somemethod'非靜態',因爲另一種方法要求它是靜態的。這是否意味着我絕對不能有一個'非靜態'列表作爲實例變量? – user2336713

+0

「非靜態」變量只能使用它們所屬的實際對象進行訪問。所以,你當然可以擁有一個非靜態的List,但是需要通過qualifier.list來訪問它。 –

0

這將是一個可怕的設計決定,但假設你可以改變靜態方法的簽名,這將有助於。

public static void somemethod(Object one[] ones, List<Superobject> li) { 
    for (one o : ones) { 
     li.add(o); 
    } 
} 

但是,如果你可以改變這個方法的簽名,你可能要使它非靜態反正。

另一方面,如果你想要實現的是將元素添加到列表中。爲什麼以下不適合你?

li.addAll(Arrays.asList(ones)); 
相關問題