如何从继承类

时间:2017-08-16 11:57:40

标签: java inheritance

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

抽象类:

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”。

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

4 个答案:

答案 0 :(得分:4)

我认为你以非常错误的方式使用abstract。您的基础类应该如下所示:

public abstract class Abstract {
  protected abstract void updateMotionY(float deltaTime);

  public final void update(float deltaTime) {
    this.updateMotionY(deltaTime);
  }
}

注意:

  • 没有必要将print“is abstract”放入抽象方法中。 java语言有一个关键字来表达这个事实。
  • 子类应该关于实现抽象方法(可能以不同的方式)。您绝对希望希望子类更改基类的其他方法的实现。您的基类定义了契约 - 并且子类应遵循该类(如Liskov Substitution Principle所述)。

换句话说:将 common 部分单独放在基类中,并确保在那里必须使用必要的abstract方法。但避免多次实施方法。这只会导致混乱和奇怪的错误。

答案 1 :(得分:3)

(new Obj()).update(10.0f)拨打Obj::update,呼叫Abstract::update,呼叫this.updateMotionY。由于thisObj的实例,因此会调用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给出的答案也可以。