0

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

对象等级一:

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

对象等级二:

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

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

我尝试将所有Objects存储listsuper类中的 a 中,但不知何故,我无法让列表成为非静态的。

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

当我尝试将Objects 添加到列表中时,eclipse 大喊li必须制作static

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

有没有办法使它成为非静态的,或者有更好的方法来存储Objects?

4

3 回答 3

1

l您似乎正在尝试从staticmethod访问您的非静态成员somemethod。您还需要更改somemethod为非静态或 make l static

于 2013-07-08T14:18:19.170 回答
0

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

您可以做的是将它们都设为静态,当您尝试Superobject在列表中保存几个实例时应该这样做。如果您不将其设为静态,则每个实例Superobject都会有自己的列表。或者您可以创建一个单独的类并调用它SuperobjectCollection并提供诸如添加、删除、获取等方法来访问底层列表。

考虑以下伪代码

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();

如果您像这样调用该方法,或者您像这样调用它,那么这里this是对象aa.somemethod()bb.somemethod()

静态方法与类而不是实例相关联,因此您可以像这样访问它:

Superobject.someobject();

不喜欢

a.someobject();
于 2013-07-08T16:22:09.103 回答
0

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

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

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

另一方面,如果您只想将元素添加到列表中。为什么以下内容对您不起作用?

li.addAll(Arrays.asList(ones));
于 2013-07-09T10:30:02.960 回答