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 はgetValueCounter クラスのメソッドをトリガーすることになっています。しかし、何らかの理由で実行すると、独自のgetValueメソッドを使用し続けます。

この方法で親メソッドを呼び出せない理由を理解してください。

お詫び:

私は今、自分の間違いに気づきました。謝罪します。lc.getValue() に気づかず、lc.increment が super.getValue() を正しく呼び出せなかった理由に戸惑いました。ストーリーの士気は、SOに投稿する前に十分な睡眠をとってください。---」

4

5 に答える 5

1

親メソッドは呼び出しですが、継承されたクラスにも getValue() メソッドがあるため、親クラスのメソッドを実行した後に呼び出されます。基本クラスから値を取得する方法を変更する必要があります。

于 2013-04-15T10:23:30.783 に答える
0

JLS 8.4.9 オーバーロードおよびJLS 8.4.8.1から。

子クラスで親メソッドをオーバーライドし、そのメソッドを子クラス インスタンスで実行する場合、オーバーライドされたメソッドを実行する必要があります。

したがって、プログラムで正しい動作が得られます。

super 子インスタンスでオーバーライドされた親メソッドを呼び出すには、 keywordを使用できます。

于 2013-04-15T10:20:57.663 に答える
0

これは、クラス B がクラス A を拡張し、クラス A がメソッドを持ち、クラス B もメソッドの実装を提供する場合、オーバーライドObject Oriented Programmingを 呼び出します。これはオーバーライドと呼ばれ、クラス B のオブジェクトを作成してメソッド foo() を呼び出すと、子クラスのメソッドが呼び出されます。void foo()void foo()

于 2013-04-15T11:11:05.597 に答える
0

子クラスを介してメソッドを呼び出すときは常に、最初に子クラス メソッドを呼び出し、次にスーパー クラス メソッドを呼び出します。

最初にスーパー クラス メソッドを呼び出したい場合は、クラスのメソッド内に記述しsuper.getValue()ます。getValue()LoopingCounter

于 2013-04-15T11:18:23.077 に答える