[英]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.