【问题标题】:Java - Inheritance regarding constructorsJava - 关于构造函数的继承
【发布时间】:2016-06-27 17:46:00
【问题描述】:

所以,我正在尝试通过将其应用于一些数学作业并使用继承制作频率分布图来练习我的 Java 技能。在我的脑海中,我将其设想为一个频率分布(父级 class= 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);
    }

}

【问题讨论】:

  • 为什么MyStatClass 必须是FreqDist 的子类?
  • 我希望每个 MyStatClass 都具有来自 FreqDist 的相同属性,同时每个都有自己独立的属性。
  • 您的继承模式中有一个循环,这导致了StackOverflowError。打破这个循环以避免错误。

标签: java inheritance constructor


【解决方案1】:

好的,所以这主要是您的设计存在缺陷的问题。

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

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

【讨论】:

  • 谢谢。我对 Java 很好,但没有那么有经验,所以我很感激你的帮助。我想如果出了什么问题,那将是我的整体设计。绝对是我将来需要做的事情。
【解决方案2】:

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

【讨论】:

  • 他们知道这一点。见他们的第一段。
  • 所以不要像我建议的那样在父类型中引用子类型。
猜你喜欢
  • 2013-03-21
  • 2011-09-09
  • 2010-12-11
  • 1970-01-01
  • 2020-08-07
  • 1970-01-01
  • 2017-04-05
  • 2018-10-30
  • 1970-01-01
相关资源
最近更新 更多