簡體   English   中英

Java中的類對象具有不同的ArrayList

[英]Having different ArrayLists for class objects in Java

我有一個類,該類有一個公共元素ArrayList myList。(我的類中也有其他元素,但它們與該元素無關)

我正在嘗試為不同的類對象設置不同的ArrayList。 但是,當我嘗試對此進行編碼時,即使使用不同的類對象,該代碼也會將每個條目保留在一個ArrayList中。 我究竟做錯了什么?

這是我嘗試的:我的課:

public class myClass {

public static ArrayList myList;
public static ArrayList getList() {
    return myList;
}
public static void setList(ArrayList myList) {
    myClass.myList = myList;
}

在主要方面:

 myClass my = new myClass();
 myClass my2 = new myClass();
 ArrayList tmp = new ArrayList();
 ArrayList tmp2 = new ArrayList();
 tmp.add("aaaaa");
 tmp.add("bbbbb");
 tmp2.add("ccccc");
 tmp2.add("ddddd");
 my.setList(tmp);
 my2.setList(tmp2);
 for(int i=0;i<my.getList().size();i++)
 {
 System.out.println(my.getList().get(i));
 }

這個主要的輸出是:

ccccc
ddddd

但我希望它是:

aaaaa
bbbbb

我究竟做錯了什么?

您已將myClass#myList聲明為靜態,這意味着CLASS myClass中僅存在myList的一個實例。 聲明它為非靜態的,包括getter和setter,讓my和my2具有不同的實例,那么您就很好了。

您在課堂上使用static。

刪除類中的變量的靜態關鍵字,您應該沒問題。 靜態是類范圍的,因此將在對象之間共享。

如下修改您的班級

public class myClass {

    public ArrayList myList;
    public ArrayList getList() {
    return myList;
}
public void setList(ArrayList myList) {
    listler.myList = myList;
}

您正在使用靜態 ArrayList myList這是常見的類的所有對象myClass 因此,您沒有得到期望的結果。 如果需要對類的所有對象分別使用ArrayList myList ,請避免使用靜態方法。


Java允許您以兩種方式訪問​​類的靜態成員及其對象,並將它們與它們的類名相關聯,但這是將靜態成員與類對象相關聯的一種不好的做法。


將靜態成員本身與類對象相關聯實際上是語言設計本身的一個缺陷(因此,應避免通過對象訪問它們),這已被C#糾正,因此在C#中,您無法將靜態成員與相應的類對象相關聯。


在Java中,如果嘗試使用相應的類對象訪問靜態成員,則某些IDE可能會發出警告或錯誤。

如其他注釋所標識,您將ArrayList聲明為static ,這意味着它在該類的所有對象實例之間共享-如以下語句所示:

my.setList(tmp);
my2.setList(tmp2);

...第二個setList覆蓋第一個。

閱讀Singleton模式,以獲取在哪里使用靜態字段的一個很好的示例:

單例模式

順便說一句,考慮將您的值傳遞到構造函數中,並且僅提供一個getter方法,從而封裝ArrayList的使用並使值不可變-例如:

myClass my = new myClass("aaaa", "bbbb");
String element = my.get(0);

最后,如果使用Java 5或6,請在處理集合/列表時考慮使用泛型:

List<String> tmp = new ArrayList<String>();

希望能有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM