我想从继承类调用的抽象类中调用抽象类的方法。
抽象类:
public abstract class Abstract {
protected void updateMotionY(float deltaTime) {
System.out.println("Abstrcat updateMotionY");
}
public void update(float deltaTime) {
this.updateMotionY(deltaTime);
}
}
继承类:
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);
}
}
主要方法类:
public static void main(String[] args) {
(new Obj()).update(10.0f);
}
每当我尝试在主类中调用new Obj().update()
方法时,它会输出“updateMotionY”和“Abstrcat updateMotionY”。我想只获得“Abstrcat updateMotionY”。
有谁能告诉我如何解决这个问题?
答案 0 :(得分:4)
我认为你以非常错误的方式使用abstract
。您的基础类应该如下所示:
public abstract class Abstract {
protected abstract void updateMotionY(float deltaTime);
public final void update(float deltaTime) {
this.updateMotionY(deltaTime);
}
}
注意:
换句话说:将 common 部分单独放在基类中,并确保在那里必须使用必要的abstract
方法。但避免多次实施方法。这只会导致混乱和奇怪的错误。
答案 1 :(得分:3)
(new Obj()).update(10.0f)
拨打Obj::update
,呼叫Abstract::update
,呼叫this.updateMotionY
。由于this
是Obj
的实例,因此会调用Obj::updateMotionY
。
这会打印“updateMotionY”。
然后调用super.updateMotionY(deltaTime)
Abstract::updateMotionY
。
这会打印“Abstrcat updateMotionY”。
这就是调用层次结构的结束,一切都会解开。
从根本上说,您的混淆似乎源于this.updateMotionY(deltaTime);
类中的Abstract
解析为updateMotionY
类中的Obj
这一事实。这基本上是the whole point of polymorphism。
你可以做的一件事是添加一个包含实际实现的私有方法(以便它不能被覆盖),并且遵从它:
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);
}
}
答案 2 :(得分:0)
如果你只想执行摘要超类'方法,那么简单的解决方案是在你的Obj类中调用super.updateMotionY
而不是super.update
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.updateMotionY(deltaTime);
}
}
答案 3 :(得分:0)
您无法创建Abstract类的实例,因此您正在创建Obj类的实例。由于您的要求只是调用Abstract类的方法,那么为什么要覆盖方法 updateMotionY
根据您的要求,您需要这样做 摘要类:
public abstract class Abstract {
protected void updateMotionY(float deltaTime) {
System.out.println("Abstrcat updateMotionY");
}
public void update(float deltaTime) {
this.updateMotionY(deltaTime);
}
}
继承类:
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);
}
}
我评论了被覆盖的代码,它将为您提供所需的结果。 此外,https://stackoverflow.com/users/8466177/steven-laan给出的答案也可以。