我有一个类,这个类有一个公共元素ArrayList myList。(我的类中也有其他元素,但它们与此元素无关)
我要做的是为不同的Class对象使用不同的ArrayLists。但是当我尝试编写代码时,即使我使用不同的类对象,代码也会保留一个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
我做错了什么?
答案 0 :(得分:3)
你声明了myClass#myList static,这意味着在CLASS myClass中只存在一个myList实例。声明它是非静态的,包括getter和setter,为my和my2设置不同的实例,你很高兴。
答案 1 :(得分:0)
你在课堂上使用静态。
删除班级变量的静态关键字,你应该没问题。静态是类作用域,因此将跨对象共享。
答案 2 :(得分:0)
按如下方式修改您的课程
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可能会发出警告或错误。
答案 3 :(得分:0)
正如其他评论所指出的那样,您将ArrayList声明为 static ,这意味着它在所有对象实例之间共享class - 如下所示:
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>();
希望有所帮助。