我有以下,精简的Java代码:
// Class, in it's own file
import java.util.*;
public class Superclass {
protected List<Subclass> instances = new ArrayList<>();
public class Subclass extends Superclass {
private int someField;
public Subclass(int someValue) {
this.someField = someValue;
updateSuperclass();
}
private void updateSuperclass() {
super.instances.add(this);
}
}
}
// Implementation, somewhere else, everything has been imported properly
Superclass big = new Superclass();
Subclass little1 = big.new Subclass(1);
Subclass little2 = big.new Subclass(2);
Subclass little3 = big.new Subclass(3);
我想在Superclass
中实施一个方法来处理所有Subclass
es。创建Subclass
后,应将自己添加到Superclass
中的列表中,但每当我尝试在Superclass
中遍历该列表时,它都会显示size是1.列表中的第一个元素(instances.get(0)
)只是吐出一个包含所有正确信息的String,但不是以对象形式,而不是单独的。就像我每次去add
列表一样,它会以字符串形式附加到第一个(或零)元素。
如何解决这个问题,以便我可以保留ArrayList
Subclass
以便稍后循环并运行方法?我绝对是Java的初学者,这对我的情况没有帮助。
答案 0 :(得分:2)
如果你需要的只是一个计数,那么我建议在父类的构造函数中更新一个静态值。
private static int instanceCount = 0;
public Constructor() {
instanceCount++;
}
如果您绝对需要列表中的每个实例,以便您可以对它们执行某些操作,那么我建议您强烈重新考虑您的设计。
您始终可以创建一个实用程序类,使您可以维护要在其上运行进程的对象列表。这种方式更像是“面向对象”。您还可以创建一个包含所有操作的类,然后创建一个只包含数据值的更简单的bean类。
但是,如果你坚持,你仍然可以使用相同的技术。
private static List<SuperClass> list = new LinkedList<SuperClass>;
public Constructor() {
list.add(this)
}
答案 1 :(得分:1)
每个实例都有自己的超类变量副本。
你想要做的是通过在它之前放置static关键字使变量“静态”。你可能甚至不需要超类完成你想要做的事情。