关于构造函数的Java继承

关于构造函数的Java继承,java,inheritance,constructor,Java,Inheritance,Constructor,因此,我试图通过将java应用于一些数学作业并使用继承制作频率分布图来练习我的java技能。在我的脑海中,我把它想象成一个频率分布父类=FreqDist,它可以以MyStatClass数组的形式拥有多个MyStatClass。每个FreqDist都有跨越所有MyStatClass的变量,这就是我将它们放在父类中的原因。然而,当我调用MyStatClass构造函数时,我的程序会得到一个StackOverflower错误。我认为这是因为supers,I line调用FreqDist构造函数并重新开始

因此,我试图通过将java应用于一些数学作业并使用继承制作频率分布图来练习我的java技能。在我的脑海中,我把它想象成一个频率分布父类=FreqDist,它可以以MyStatClass数组的形式拥有多个MyStatClass。每个FreqDist都有跨越所有MyStatClass的变量,这就是我将它们放在父类中的原因。然而,当我调用MyStatClass构造函数时,我的程序会得到一个StackOverflower错误。我认为这是因为supers,I line调用FreqDist构造函数并重新开始,导致了一个无限循环。假设是这样,我该如何解决这个问题

理想情况下,我希望访问我的MyStatClass数组并获取仅适用于该MyStatClass的值,但我无法让它工作

public class FreqDist {

private MyStatClass[] freqClasses;

private double[] dblValuesArray;
private int intNumberOfClasses;
private double dblMax;
private double dblMin;
private int intClassWidth;

public FreqDist(String strValues, int intNumOfClasses) {
    System.out.println("This is the beginning of the FreqDist constructor...");
    dblValuesArray = getDoubleValues(strValues);
    intNumberOfClasses = intNumOfClasses;

    dblMin = dblValuesArray[0];
    dblMax = dblValuesArray[dblValuesArray.length - 1];

    intClassWidth = (int)Math.ceil((dblMax - dblMin) / intNumberOfClasses);

    freqClasses = new MyStatClass[intNumberOfClasses];

    for (int x = 0; x < freqClasses.length; x++) {
        freqClasses[x] = new MyStatClass(strValues, intNumOfClasses);
    }
}

public double[] getDoubleValues(String strValues) {
    String[] strValuesArray = strValues.trim().split(" ");
    dblValuesArray = new double[strValuesArray.length];

    for (int x = 0; x < strValuesArray.length; x++) {
        dblValuesArray[x] = Double.parseDouble(strValuesArray[x]);
    }
    Arrays.sort(dblValuesArray);

    return dblValuesArray;
}

public int getNumberOfClasses() {
    return intNumberOfClasses;
}

public double getMin() {
    return dblMin;
}

public double getMax() {
    return dblMax;
}


public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    System.out.print("What are the values? ");
    String values = scan.nextLine();
    System.out.print("How many classes? ");
    int classes = scan.nextInt();
    FreqDist fd = new FreqDist(values, classes);
}
}

public class MyStatClass extends FreqDist {

    public MyStatClass(String s, int i) {
        super(s, i);
    }

}

好吧,这主要是因为你的设计有缺陷

据我所知,FreqDist是一个应该包含MyStatClass数组的类。您希望它们具有相同的属性,因此可以使MyStatClass扩展FreqDist。然而,当你调用FreqDist时,它就是MyStatClass,它一遍又一遍地调用一个新的MyStatClass


解决这个问题的一种方法是创建一个新类,该类具有您希望FreqDist和MyStatClass具有的共享属性,并让这两个类从该类继承。然后为FreqDist和MyStatClass创建单独的构造函数。

父类型决不能像您的子类型那样引用自己的子类型。她的父项初始化子类型实例,这要求每个子类型实例初始化父类型,这初始化子类型实例,这初始化它们的父类型,这初始化。。。卡布鲁伊

为什么MyStatClass需要是FreqDist的子类?我希望每个MyStatClass都有来自FreqDist的相同属性,而每个MyStatClass都有各自独立的属性。继承模式中有一个循环,这会导致StackOverflower错误。中断此循环以避免错误。谢谢。我对Java没问题,也没有那么丰富的经验,所以我非常感谢您的帮助。我想如果有什么不对劲,那就是我的总体设计。肯定是我将来需要做的事情。他们知道这一点。请参阅他们的第一段。因此,正如我所建议的,不要在父类型中引用子类型。