2016-12-02 115 views
-1

該方案已在WeightedDie延長模具類,如下一類關係:Java的繼承:在超類中調用子類方法

​​

public class WeightedDie extends Die 
{ 
    private int randomNum; 
    private int maxNumSides = 6; 
    private double [] weights; 
    private Random rand; 
    private double sum = 0; 
    private double weightRoll; 
    private int cumulWeight; 
    private double cumulWeightDouble; 


public WeightedDie() 
{ 
    super(); 
} 

public WeightedDie(double[] w) 
{ 
    ... 
} 

public int roll() 
{ 
    cumulWeight = 0; 
    cumulWeightDouble = 0; 
    weightRoll = 0; 
    rand = new Random(); 

    randomNum = rand.nextInt(100) + 1; 

    for(int i = 0; i < 6; i++) 
    { 
     weightRoll = weights[i]*100; 
     cumulWeightDouble = weightRoll + cumulWeightDouble; 
     cumulWeight = (int) cumulWeightDouble; 

     if(randomNum >= (cumulWeight - weightRoll) && randomNum <= (cumulWeight)) 
     { 
      _faceValue = i; 
      break; 
     } 
    } 
    return _faceValue; 
} 
} 

我的問題似乎是,在WeightedDie構造函數使用super()的Die構造函數。在Die構造函數中this.roll()被調用,並且這調用了WeightedDie的roll()而不是Die的roll(),它給出了一個空指針。我想在Die中使用this.roll()來調用Die的roll()方法。這怎麼解決?

+0

  • 改變輥()方法名TBH我會從構造 - 它不應該存在刪除'roll' - 而不是在構造Object之後,您可以調用'roll' –

  • +0

    另請參閱http://stackoverflow.com/questions/6386343/how-to-call-a-super-method-ie-tostring-from-outside- a-derived-class –

    +0

    是的,這是有道理的。這段代碼是由教授提供給我的,所以我不確定我是否需要改變它。但是,我在子類的roll方法中檢查了檢查是否爲null,如果是,則調用super.roll()。我認爲這應該解決問題,謝謝! – knueser

    回答

    -1

    在模具構造this.roll()被調用,這是調用WeightedDie的卷(),而模具的卷(),

    這是正確的,但不是一個問題。

    它給出一個空指針。

    顯示堆棧跟蹤。可能這條線有問題:

    weightRoll = weights[i]*100; 
    

    因爲weights數組未被初始化。

    看到這個:How do I declare and initialize an array in Java?

    +0

    是的,我知道該數組未初始化。我想知道是否可以在Die構造函數中調用Die's roll方法而不是WeightedDie的roll方法。正如上面所說的ScaryWombat,代碼應該改變爲不在構造函數中調用roll。 – knueser

    +0

    您有兩種方法:1.創建Die的對象而不是WeightedDie。或2.重命名Die類中的'roll'。如果你重寫,這是定義的brhaviour。 – Azodious

    -1

    我們有以下選項來解決這個問題。

    1. 通過super.roll()方法調用解決空指針異常。在超和子類
    2. 改變超類的卷()方法,以私人