Java中的对象列表

时间:2009-10-26 04:26:51

标签: java

我正在尝试制作一个包含不同对象的列表。

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

和defObject只有一个String属性。

    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;
    }           
}

如果我在列表中添加多个defObject并在完成添加元素之后遍历列表,则它们都包含相同的字符串,这是添加到列表中的最后一个defObject。

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

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

,结果是两个defObjects,字符串为“y”

请帮我弄清楚为什么没有正确添加对象,并且属性与添加到列表中的最后一个defObj完全相同。

4 个答案:

答案 0 :(得分:12)

问题是defObjstatic所以所有实例都共享同一个变量。从班级中的任何地方删除单词static,一切都可能按预期工作。

答案 1 :(得分:3)

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

答案 2 :(得分: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中按照惯例注意,类名以大写开头,而左大括号在同一行。

答案 3 :(得分:0)

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