Java - 关于构造函数的继承

时间:2016-06-27 17:46:01

标签: java inheritance constructor

所以,我试图通过将它应用于一些数学作业并使用继承制作频率分布图来练习我的Java技能。在我的脑海中,我将它设想为频率分布(父类= FreqDist),它可以有多个" MyStatClasses" (以MyStatClass数组的形式)。每个FreqDist都有跨越所有MyStatClasses的变量,这就是我将它们放在父类中的原因。但是,当我调用MyStatClass构造函数时,我的程序会得到一个StackOverflowError。我认为这是因为super(s,i)行调用回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);
    }

}

2 个答案:

答案 0 :(得分:0)

好的,这主要是你设计中存在缺陷的问题。

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

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

答案 1 :(得分:0)

父类型不应该像你的那样引用它自己的子类型。她的父类初始化子类型实例,这需要每个初始化父类型,初始化子类型实例,初始化它们的父类型,初始化... KABLOOEY!