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() 。故事的精神是在发帖之前有足够的睡眠。-_-”

4

5 回答 5

1

您的父方法被调用,但由于您的继承类也具有 getValue() 方法,因此在执行父类方法后调用它。您应该改变从基类中获取价值的方式。

于 2013-04-15T10:23:30.783 回答
1

行为是正确的。如果你想调用CountergetValue(),那么你需要在类方法super.getValue()的某个地方。将始终调用类内部定义的方法,就像.LoopingCountergetvalue()lc.getValue()getValue()LoopingCounterlcLoopingCounter

于 2013-04-15T10:13:55.847 回答
0

每当您通过子类调用任何方法时,它总是首先调用子类方法,然后调用超类方法。

如果要先调用超类方法,则在类的super.getValue()内部getValue()方法中编写LoopingCounter

于 2013-04-15T11:18:23.077 回答
0

如果类 B 扩展类 A,类 A 具有方法,并且类 B 还提供方法的实现,则这Object Oriented Programming 称为覆盖,这称为覆盖,如果您创建 B 类的对象并调用子类的方法 foo(),则将调用该方法。void foo()void foo()

于 2013-04-15T11:11:05.597 回答
0

来自JLS 8.4.9 重载JLS 8.4.8.1

如果您在子类中覆盖父方法,并且使用子类实例运行该方法,则应该运行被覆盖的方法。

所以你在你的程序中得到了正确的行为。

要使用子实例调用父覆盖方法,您可以使用super 关键字

于 2013-04-15T10:20:57.663 回答