2013-04-15 41 views
1
public class Counter{ 
    private int value; 


    public int getValue(){ 
     return value; 
    } 

    public void setValue (int value){ 
     this.value = value; 
    } 

    public void increment() { 

     /* */ 
    } 

    public void decrement() { 
     /* */ 
    } 
} 


public class LoopingCounter extends Counter{ 

    private int limit; 

    public LoopingCounter(int limit){ 
     this.limit = limit; 
    } 

    public void increment(){ 
     int value = super.getValue(); 
     if(value == limit){ 

      System.out.println("Value has reached the limit, cannot increment any further!"); 
      setValue(0); 

     } else{ 
      value++; 
      setValue(value); 
     } 
    } 
    public void decrement(){ 
     int value = super.getValue(); 
     if(value == limit){ 
      System.out.println("Value has reached the limit, cannot decrement any further!");    
     } else{ 
      value--; 
      setValue(value); 
     } 
    } 

    public int getValue() { 
     System.out.println("override"); 
     return 1000; 
    } 

} 

public class CounterTest{ 
    public static void main(String[] args){ 

     LoopingCounter lc = new LoopingCounter(100); 


     for(int i=0; i<150; i++){ 
      lc.increment(); 
      System.out.println(lc.getValue()); 
     } 

    } 
} 

在這種情況下,LoopingCounter應該觸發Counter類中的getValue方法。但由於某些原因,當我運行它時,它會繼續使用它自己的getValue方法。java super沒有按預期工作

請幫我理解爲什麼我不能用這種方法調用父方法。

道歉:

我現在看到我的錯誤。我道歉。我沒有意識到lc.getValue()並且感到困惑,爲什麼lc.increment未能正確調用super.getValue()。在SO發佈之前,故事的士氣是充足的睡眠。 -_-」

+0

這樣的東西已經回答了,看看這裏:http://stackoverflow.com/questions/1032847/can-java-call-parent-overridden-method-in-other-objects-but-not-subtype – Xavjer

+0

'LoopingCounter'定義了它自己的'getValue()'方法。如果你不希望它被引用,你想達到什麼目的? – NilsH

+0

我們是否在討論'super.getValue()'在'increment'和'decrement'方法中不工作或者'lc.getValue()'不在'CounterTest'類中工作的調用?如果是後者,那麼它「不按預期工作」,因爲你不明白它是如何工作的。 –

回答

0

刪除答案爲不正確。很快會發布更新。

+1

這兩個例子都不一樣嗎?只要它是相同的具體實現,將它指定爲不同的類型不應有所作爲。 – NilsH

+0

@NilsH:我現在已經運行了代碼,並注意到我的回答是多麼的錯誤。我已經學會了在提交到stackoverflow之前總是測試代碼...刪除答案,將發佈更新的版本。 Mea culpa,讓我驗證的榮譽! – ya23

1

的行爲是正確的。如果你想打電話getValue()Counter類,那麼你需要有super.getValue()某處LoopingCountergetvalue()方法內。lc.getValue()會隨時撥打LoopingCounter類中定義爲lcgetValue()方法是的LoopingCounter一個實例。

0

JLS 8.4.9 OverloadingJLS 8.4.8.1

如果替換喲父類的方法u子類,然後用子類實例運行該方法,則應該運行重寫的方法。

所以你在你的程序中得到了正確的行爲。

對於用子實例調用父重寫方法,可以使用superkeyword

1

您的父方法是調用,但作爲您的繼承類也有getValue()方法,所以它在執行父類方法後調用。你應該改變你的方式來從基類中獲得價值。

0

這是Object Oriented Programming呼叫Overriding如果類B擴展A類,A類有方法void foo()和B類還提供了實施void foo()方法這就是所謂的覆蓋和如果您創建B類的對象,並調用方法foo()方法子類將被調用。

0

每當你通過子類調用任何方法時,它總是首先調用子類方法,然後調用超類方法。

如果您想先打電話給超級班的方法,那麼您在裏面寫super.getValue()LoopingCounter班的方法。