如何在List中存储多个对象类的许多实例

时间:2013-07-08 14:14:52

标签: java object

我有几个Java Object使用以下类(同一个超类的所有部分)。

对象类一:

Class one extends Superobject {
    int no;
    int i;
    String s;
}

对象类二:

Class two extends Superobject {
    int no;
    int i;
    String s;
}

我想通过阅读文本文件并在每个单词之后调用Object一个和Object两个构造函数来创建许多这些对象。

我已经尝试将所有Object存储在list类的super中,但不知何故,我无法将列表设置为非静态。

Class Superobject {
    int no;
    int i;
    String s;
    List<Superobject> li; // of course, when called with the
    //method below: static List<Superobject> li
    }

当我尝试将Object添加到列表中时,eclipse会大吼大叫li必须static

public static void somemethod(Object one[] ones) {
    for (one o : ones) {
        li.add(o);
    }
}

有没有办法让它成为非静态的,还是有更好的方法来存储Object

3 个答案:

答案 0 :(得分:1)

您似乎正在尝试从l方法static访问您的非静态成员somemethod。您还需要将somemethod更改为非静态,或者制作l static

答案 1 :(得分:0)

非静态方法与类的实例相关联,而静态方法与类本身相关联。您正尝试从静态方法访问非静态成员。 因此,编译器无法将非静态成员与任何对象相关联。

您可以做的是将它们都设置为静态,当您尝试在列表中保存多个Superobject实例时应该这样做。如果你不使它成为静态的,Superobject的每个实例都有自己的列表。 或者,您可以创建一个单独的类并将其命名为SuperobjectCollection,并提供诸如Add,Remove,Get等方法来访问基础List。

考虑以下伪代码

class SuperobjectCollection {
private List<Superobject> list;

  public AddObj(Superobject obj) {
    list.add(obj);
  }
}

您可以在添加,检索或删除对象时添加任何逻辑。

如果要将列表保留在Superobject类中,则必须使其静态并使用静态方法访问它。如果你不这样做(就像你提供的代码那样),你会遇到以下情况:

Class Superobject {
    int no;
    int i;
    String s;
    List<Superobject> li; 
    }

如果您创建两个实例,如:

Superobject a = new one();
Superobject b = new two();

ab都包含单独的li。如果您的somemethod是非静态的,则可以使用该方法访问此列表,例如

li.add();

或喜欢

this.li.add();

如果您调用类似thisa的方法a.somemethod(),那么b就是对象b.somemethod()Superobject.someobject();

静态方法与class not instance关联,因此您可以像这样访问它:

a.someobject();

不喜欢

{{1}}

答案 2 :(得分:0)

这将是一个糟糕的设计决定,但假设您可以更改静态方法的签名,这将有所帮助。

public static void somemethod(Object one[] ones, List<Superobject> li) {
    for (one o : ones) {
        li.add(o);
    }
}

但是,如果您可以更改此方法的签名,您可能希望将其设置为非静态。

另一方面,如果你想要实现的只是将元素添加到列表中。为什么以下不适合您?

li.addAll(Arrays.asList(ones));