2009-10-26 44 views
4

我想做一个包含不同对象的列表。在Java中的对象列表

List<Object> list = new ArrayList<Object>(); 
    defObject defObj; 
    optObject optObj; 

和defObject只有一个字符串属性。

public static class defObject 
{ 
    public static String defObj; 

    public defObject(String x) 
    { 
     setDefObj(x);   
    } 

    public static String getDefObj() { 
     return defObj; 
    } 

    public static void setDefObj(String defObj) { 
     defObject.defObj = defObj; 
    }   
} 

,如果我多defObjects添加到列表中,并浏览清单,我做了后加入它们都包含相同的字符串,这是最后defObject的添加到列表中的元素。

我在做这样的事情的对象添加到列表:

if (whatever) 
     list.add(defObj = new defObject("x")); 
    else if(whatever) 
     list.add(defObj = new defObject("y")); 

和结果是两个defObjects与“Y”

字符串请帮我找出为什么对象未被正确添加,属性与添加到列表中的最后一个defObj完全相同。

+8

类名应该大写。 – 2009-10-26 04:28:35

回答

12

问题是defObjstatic所以所有的实例都共享相同的变量。从班级中的任何地方删除单词static,并且所有内容都可能按照您的预期工作。

3

String defObj变量是静态的,所以对于defObject的所有实例它总是相等的。在你的方法和属性声明之前删除“static”,它应该工作。

3

替换:

public static class defObject 
{ 
    public static String defObj; 
    ... 

有了:

public static class defObject 
{ 
    public String defObj; 
.... 

甚至更​​好:

public class DefObject { 
    private String defObj; 
    .... 

使用关键字static会使属性或方法的class方法,这意味着所有实例只会有一个。

将其从您的代码中删除。另请注意,按照惯例,Java中的类名以大写字母开头,并且左大括号在同一行中。

+1

我给你的名字以大写字母开头,但是不要打开大括号应该在同一行 - 这是一个非常主观的。 – 2009-10-26 05:04:52

+0

很多开发者都将自己的大括号放在自己的路线上。 – 2009-10-26 05:28:46

+0

@non sequitor:是的,这是非常主观的,但事实证明,主要编程语言是Java的开发人员可以做到这一点。我宁愿阅读代码,看起来像你在这种情况下Java的目标。我对C#也做了同样的事情,我在它自己的行中使用了大括号,因为这是大多数C#开发人员所做的。 – OscarRyz 2009-10-26 16:26:51

0

您从public static String defObj;static后,使其private你还需要从方法签名删除staticstatic方法不能从静态上下文访问实例变量即defObject.getDefObj()不能因为访问实例变量defObj编译器不能确保它已经存在 - 没有实例被实例化,因此没有实例变量。这只能通过类加载的static属性完成。