在Java中为类对象提供不同的ArrayList
我有一个类,这个类有一个公共元素ArrayList myList。(我的类中也有其他元素,但它们与这个元素无关) 我想做的是为不同的类对象创建不同的ArrayList。但是,当我尝试编写此代码时,即使我使用不同的类对象,代码也会在单个ArrayList中保留每个条目。我做错了什么 这就是我所尝试的: 我的班级:在Java中为类对象提供不同的ArrayList,java,class,arraylist,Java,Class,Arraylist,我有一个类,这个类有一个公共元素ArrayList myList。(我的类中也有其他元素,但它们与这个元素无关) 我想做的是为不同的类对象创建不同的ArrayList。但是,当我尝试编写此代码时,即使我使用不同的类对象,代码也会在单个ArrayList中保留每个条目。我做错了什么 这就是我所尝试的: 我的班级: public class myClass { public static ArrayList myList; public static ArrayList getList() {
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));
}
但我希望它是:
aaaaa
bbbbb
我做错了什么?您在课堂上使用的是static
删除类中变量的static关键字,您应该会没事的。静态是类作用域,因此将在对象之间共享。您在类中使用静态
删除类中变量的static关键字,您应该会没事的。静态是类的作用域,因此将在对象之间共享。您声明了myClass#myList Static,这意味着在类myClass中只存在一个myList实例。声明为非静态,包括getter和setter,以使my和my2具有不同的实例,您就可以开始了。您声明了myClass#myList static,这意味着myList在myClass类中只存在一个实例。声明它是非静态的,包括getter和setter,以使my和my2具有不同的实例,就可以开始了。如下修改您的类
public class myClass {
public ArrayList myList;
public ArrayList getList() {
return myList;
}
public void setList(ArrayList myList) {
listler.myList = myList;
}
您正在使用的是静态
数组列表myList
,这是类的所有对象所共有的myClass
。因此,你没有得到你所期望的。如果需要对类的所有对象分别使用ArrayList myList
,请避免使用static
Java允许您访问类的静态成员,既可以通过对象访问,也可以通过将静态成员与其类名关联来访问,但将静态成员与类对象关联是一种不好的做法
将静态成员本身与类对象关联实际上是语言设计本身的一个缺陷(因此,应该避免使用对象访问它们),这一缺陷已被C#纠正,因此在C#中,您不能将静态成员与相应的类对象关联
在java中,如果您试图使用相应的类对象访问静态成员,某些IDE可能会发出警告或错误。按如下方式修改您的类
public class myClass {
public ArrayList myList;
public ArrayList getList() {
return myList;
}
public void setList(ArrayList myList) {
listler.myList = myList;
}
您正在使用的是静态
数组列表myList
,这是类的所有对象所共有的myClass
。因此,你没有得到你所期望的。如果需要对类的所有对象分别使用ArrayList myList
,请避免使用static
Java允许您访问类的静态成员,既可以通过对象访问,也可以通过将静态成员与其类名关联来访问,但将静态成员与类对象关联是一种不好的做法
将静态成员本身与类对象关联实际上是语言设计本身的一个缺陷(因此,应该避免使用对象访问它们),这一缺陷已被C#纠正,因此在C#中,您不能将静态成员与相应的类对象关联
在java中,如果您试图使用相应的类对象访问静态成员,某些IDE可能会发出警告或错误。如其他注释所示,您将ArrayList声明为static,这意味着它在类的所有对象实例中共享-如下所示:
my.setList(tmp);
my2.setList(tmp2);
…第二个设置列表覆盖第一个设置列表
请继续阅读Singleton模式,了解如何使用静态字段的示例:
作为旁白,考虑将你的值传递给构造函数,只提供一个吸气剂,从而封装使用ARARYLIST并使值不可变——例如:
myClass my = new myClass("aaaa", "bbbb");
String element = my.get(0);
最后,如果使用Java 5或6,请考虑在使用集合/列表时使用泛型:
List<String> tmp = new ArrayList<String>();
List tmp=newarraylist();
希望这会有所帮助。正如其他注释所指出的,您将ArrayList声明为static,这意味着它在类的所有对象实例中共享,如下所示:
my.setList(tmp);
my2.setList(tmp2);
…第二个设置列表覆盖第一个设置列表
请继续阅读Singleton模式,了解如何使用静态字段的示例:
作为旁白,考虑将你的值传递给构造函数,只提供一个吸气剂,从而封装使用ARARYLIST并使值不可变——例如:
myClass my = new myClass("aaaa", "bbbb");
String element = my.get(0);
最后,如果使用Java 5或6,请考虑在使用集合/列表时使用泛型:
List<String> tmp = new ArrayList<String>();
List tmp=newarraylist();
希望有帮助