如何从继承类调用的抽象类调用抽象方法

Ama*_*eus 5 java inheritance

我想从继承类调用的抽象类中调用抽象类的方法。

抽象类:

public abstract class Abstract {
    protected void updateMotionY(float deltaTime) {
        System.out.println("Abstrcat updateMotionY");
    }
    public void update(float deltaTime) {
        this.updateMotionY(deltaTime);
    }
}
Run Code Online (Sandbox Code Playgroud)

继承类:

public class Obj extends Abstract {
    @Override
    protected void updateMotionY(float deltaTime) {
        System.out.println("updateMotionY");
        super.updateMotionY(deltaTime);
    }
    @Override
    public void update(float deltaTime) {
        super.update(deltaTime);
    }
}
Run Code Online (Sandbox Code Playgroud)

主要方法类:

public static void main(String[] args) {
    (new Obj()).update(10.0f);
}
Run Code Online (Sandbox Code Playgroud)

每当我尝试打电话时 new Obj().update()在主类中方法时,它都会打印“updateMotionY”和“Abstrcat updateMotionY”。我只想得到“Abstrcat updateMotionY”。

谁能告诉我如何解决这个问题?

Mic*_*ael 3

(new Obj()).update(10.0f)呼叫Obj::update哪个呼叫Abstract::update哪个呼叫this.updateMotionY。因为this是 的一个实例Obj,所以 this 调用Obj::updateMotionY.

这将打印“updateMotionY”。

然后调用super.updateMotionY(deltaTime)which is Abstract::updateMotionY

这将打印“Abstrcat updateMotionY”。

这是调用层次结构的末尾,一切都展开了。


从根本上讲,您的困惑似乎源于以下事实:this.updateMotionY(deltaTime);Abstract课堂上解决了updateMotionYObj课堂上。这基本上就是多态性的全部要点


您可以做的一件事是添加一个包含实际实现的私有方法(以便它不能被重写),并遵循它:

public abstract class Abstract {
    private void motionY(float dt)
    {
        System.out.println("Abstrcat updateMotionY");
    }

    protected void updateMotionY(float deltaTime) {
        motionY(deltaTime);
    }
    public void update(float deltaTime) {
        motionY(deltaTime);
    }
}
Run Code Online (Sandbox Code Playgroud)