2016-06-27 15 views
-3

私はいくつかの数学の宿題にそれを適用し、継承を使用して度数分布図を作成することによって、自分のJavaスキルを練習しようとしています。私の頭では、複数の "MyStatClasses"(MyStatClass配列の形式)を持つことができる度数分布(親クラス= FreqDist)として考えています。各FreqDistには、すべてのMyStatClassesにまたがる変数があります。なぜなら、それらを親クラスに入れているからです。しかし、私がMyStatClassコンストラクタを呼び出すと、私のプログラムはStackOverflowErrorを取得します。これは、super(s、i)行がFreqDistコンストラクタを呼び出して開始し、無限ループを引き起こすためです。これが当てはまるとすれば、どうすればこの問題を解決できますか?Java - コンストラクタに関する継承

理想的には、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); 
    } 

} 
+4

なぜ 'MyStatClass'は' FreqDist'のサブクラスである必要がありますか? –

+0

それぞれの 'MyStatClass'に' FreqDist'から来たのと同じプロパティを持たせ、それぞれ独自の別々のプロパティを持つようにしたいと思います。 –

+0

継承パターンにループがあり、これは 'StackOverflowError'を引き起こしています。このループを解除して、エラーを回避します。 –

答えて

0

これは主にデザインに欠陥があるためです。

FreqDistは、MyStatClassの配列を含むクラスです。 MyStatClassをFreqDistに拡張させるために、それらのプロパティを同じにしたいとします。しかし、FreqDistを呼び出すと、新しいMyStatClassを繰り返し呼び出すMyStatClassが呼び出されます。

これを解決する方法の1つは、FreqDistとMyStatClassに必要な共有プロパティを持つ新しいクラスを作成し、そのクラスから継承する2つのクラスを作成することです。その後、FreqDistとMyStatClassのための別々のコンストラクタを作成します。

+0

ありがとうございます。私はJavaで問題なく、経験豊富な人ではないので、私は助けに感謝します。私は何かが間違っていたら、私の全体的なデザインになると思った。間違いなく私は将来的に仕事をする必要があります。 –

0

親タイプは、自分のサブタイプを参照するべきではありません。彼女は親がサブタイプインスタンスを初期化します。サブタイプインスタンスを初期化すると、サブタイプインスタンスが初期化され、初期化される親タイプが初期化されます。KABLOOEY!

+0

彼らはこれを知っています。最初の段落を参照してください。 –

+0

私は示唆したように、親タイプの子タイプを参照しないでください。 –