2011-11-20 28 views
0

我有一个类,这个类有一个公共元素的ArrayList myList中。(我有其他元素太在我的课,但他们什么都没有做与此元素)具有类对象不同的ArrayList中的Java

我我试图做的是为不同的类对象使用不同的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 

我在做什么错?

回答

3

您声明了myClass#myList static,这意味着myList中只有myList的一个实例存在。声明它是非静态的,包括getter和setter,为my和my2创建不同的实例,并且你很好。

0

您正在课堂中使用静态。

删除类中变量的static关键字,你应该没问题。静态是类的作用域,因此将在对象之间共享。

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可能会发出警告或错误。

0

所确定的其他意见,您声明ArrayList中为静态,这意味着它是跨共享所有对象实例类的 - 因此在下面的语句:

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

...第二个setList覆盖第一个。

阅读了Singleton模式进行的,其中使用静态字段一个很好的例子:

Singleton pattern

顺便说一句,考虑通过自己的价值观到构造函数,只提供一个getter,因而封装使用ArrayList的,使值不变的 - 例如:

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

最后,如果使用Java 5或6,使用集合/列表工作时考虑使用泛型:

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

希望有所帮助。

相关问题