Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 跟踪超类中子类的所有实例_Java_Oop - Fatal编程技术网

Java 跟踪超类中子类的所有实例

Java 跟踪超类中子类的所有实例,java,oop,Java,Oop,我有以下精简的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;

我有以下精简的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);
//类,在它自己的文件中
导入java.util.*;
公共类超类{
受保护列表实例=新建ArrayList();
公共类子类扩展了超类{
私人领域;
公共子类(int-someValue){
this.someField=someValue;
updateSuperclass();
}
私有void updateSuperclass(){
super.instances.add(这个);
}
}
}
//在其他地方,所有内容都已正确导入
超类大=新的超类();
子类little1=大。新的子类(1);
子类little2=大。新的子类(2);
子类little3=大。新的子类(3);
我想在
超类
中实现一个方法来处理所有
子类
e。创建
子类
时,它应该将自己添加到
超类
中的列表中,但每当我尝试在
超类
中循环该列表时,它都会说大小为1。列表中的第一个元素(
instances.get(0)
)只是吐出一个包含所有正确信息的字符串,但不是对象形式,也不是单独的。就像每次我转到
添加到列表中,它都会以字符串形式附加到第一个(或第零个)元素


如何解决这个问题,以便维护
子类的
ArrayList
,以便稍后循环并从中运行方法?我绝对是Java的初学者,这对我的情况没有帮助

每个实例都有自己的超类变量副本


您要做的是将static关键字放在变量前面,使变量成为“static”。您甚至可能不需要超类来完成您试图完成的任务。

如果您只需要一个计数,那么我建议在父类的构造函数中更新一个静态值

private static int instanceCount = 0;
public Constructor() {
    instanceCount++;
}
如果你绝对需要列表中的每个实例,这样你就可以对它们做些什么,那么我强烈建议你重新考虑你的设计

您始终可以创建一个实用程序类,该类将允许您维护要在其上运行进程的对象列表。这样更“面向对象”。您还可以创建一个包含所有操作的类,然后创建一个只包含数据值的简单bean类

但是,如果你坚持,你仍然可以使用同样的技术

private static List<SuperClass> list = new LinkedList<SuperClass>;
public Constructor() {
    list.add(this)
}
private static List=new LinkedList;
公共构造函数(){
列表。添加(此)
}

注意子类!=“内心的阶级!”SotiriosDelimanolis哦,伙计,现在我更困惑了。我想子类是从超类继承方法的东西,而内部类就是我所拥有的?我觉得我需要内部类,所以我可以使用
super.instances.add
是的,一个子类只是一个扩展了另一个子类的类。是在另一个类中声明的类。你可以把两者结合起来。看来我要认真重新考虑我的设计了。目前,在将列表设置为静态后,它似乎完全按照预期工作。非常感谢。谢谢,我试试看!