我有几个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
?
答案 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();
a
和b
都包含单独的li
。如果您的somemethod
是非静态的,则可以使用该方法访问此列表,例如
li.add();
或喜欢
this.li.add();
如果您调用类似this
或a
的方法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));