我想从继承类调用的抽象类中调用抽象类的方法。
抽象类:
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”。
谁能告诉我如何解决这个问题?
(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课堂上解决了updateMotionY在Obj课堂上。这基本上就是多态性的全部要点。
您可以做的一件事是添加一个包含实际实现的私有方法(以便它不能被重写),并遵循它:
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)