【问题标题】:Having different ArrayLists for class objects in JavaJava 中的类对象有不同的 ArrayList
【发布时间】:2011-11-20 22:45:48
【问题描述】:

我有一个类,这个类有一个公共元素 ArrayList myList。(我的类中也有其他元素,但它们与这个元素无关)

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

我做错了什么?

【问题讨论】:

    标签: java class arraylist


    【解决方案1】:

    您将 myClass#myList 声明为静态,这意味着在 CLASS myClass 中只存在一个 myList 实例。声明它是非静态的,包括 getter 和 setter,为 my 和 my2 拥有不同的实例,你就可以开始了。

    【讨论】:

      【解决方案2】:

      您在课堂上使用静态。

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

      【讨论】:

        【解决方案3】:

        正如其他 cmets 所确定的,您将 ArrayList 声明为 static,这意味着它在类 - 在以下语句中:

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

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

        阅读单例模式,了解如何使用静态字段的一个很好的示例:

        Singleton pattern

        顺便说一句,考虑将您的值传递给构造函数并仅提供一个 getter,从而封装 ArrayList 的使用并使值不可变 - 例如:

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

        最后,如果使用 Java 5 或 6,请考虑在处理集合/列表时使用泛型:

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

        希望对您有所帮助。

        【讨论】:

          【解决方案4】:

          如下修改你的类

          public class myClass {
          
              public ArrayList myList;
              public ArrayList getList() {
              return myList;
          }
          public void setList(ArrayList myList) {
              listler.myList = myList;
          }
          

          您正在使用 static ArrayList myList,这是您的类 myClass 的所有对象所共有的。因此,你没有得到你所期望的。避免使用静态,如果您需要对类的所有对象分别使用ArrayList myList


          Java 允许您以两种方式访问​​类的静态成员及其对象以及将它们与其类名相关联,但将静态成员与类对象相关联是一种不好的做法。


          将静态成员本身与类对象相关联实际上是语言设计本身的一个缺陷(因此,应避免使用对象访问它们)已被 C# 纠正,因此在 C# 中您不能将静态成员与相应的类对象相关联.


          在 java 中,如果您尝试使用相应的类对象访问静态成员,某些 IDE 可能会发出警告或错误。

          【讨论】:

            猜你喜欢
            • 2015-06-22
            • 1970-01-01
            • 2012-11-14
            • 1970-01-01
            • 2020-08-23
            • 1970-01-01
            • 2011-04-12
            • 1970-01-01
            • 2012-12-13
            相关资源
            最近更新 更多