当前位置: 首页 > 知识库问答 >
问题:

子类方法不重写父类中相同签名的方法

常朗
2023-03-14

为什么我的子类方法不重写其父类中相同签名的方法?

我有一个类PlayerPaddle,它扩展了一个抽象类Paddle,后者扩展了抽象类Actor(这里的上下文是一个pong游戏)。paddleplayerpaddle都有一个具有相同签名的方法:

public void moveDown()

目的是让PlayerPaddleMoveDown方法重写Paddle的方法。这里的问题是,当我在playerpaddle内部调用this.movedown()时,只调用paddlemovedown方法。

Paddle中的MoveDown()上设置的断点会脱扣,而在PlayerPaddle中的MoveDown()上设置的断点从不脱扣。我还在PlayerPaddleMoveDown方法上尝试了@override,但它仍然调用PaddleMoveDown方法。

目标是让PlayerPaddle对象以与其他Paddle对象不同的速度上下移动。因此moveup方法也会出现同样的问题。

abstract public class Actor {
    public void releasedEvent(KeyEvent e) {
    }
}

abstract public class Paddle extends Actor {
     public void moveDown() { // this method is called
          body.setVel(0, Game.dX / 10.);   
     }
}


public class PlayerPaddle extends Paddle {
    @Override
    public void moveDown() { // this method never gets called
       body.setVel(0,  Game.dX );
    } 

    public void receiveEvent(KeyEvent e) {
       if (e.getKeyCode() == KeyEvent.VK_UP) {
          this.moveUp(); 
       } else if (e.getKeyCode() == KeyEvent.VK_DOWN) {
          this.moveDown(); // Want to call moveDown() inside PlayerPaddle
       }
    }

}

我很乐意提供澄清。

共有1个答案

子车安和
2023-03-14

看看简单的案例,它起作用了:

public class Test{

  public static void main(String args[])
  {     
    new PlayerPaddle().receiveEvent();
  }
}
abstract class Actor {
  public void releasedEvent(KeyEvent e) {
  }
}
abstract class Paddle extends Actor {
  public void moveDown() { // this method is called
      System.out.println("paddle");
  }
}
class PlayerPaddle extends Paddle {
  @Override
  public void moveDown() { // this method never gets called
   System.out.println("playerpaddle");
  } 
  public void receiveEvent() {
     this.moveDown(); // Want to call moveDown() inside PlayerPaddle      
  }
}

它叫PlayerPaddle。

 类似资料:
  • 我最近开始学习Java,目前正在研究多态性。考虑下面的代码: 在执行这段代码时,我发现sides()方法不能被重写。我理解在重写中,方法名和返回类型应该相同,但在本例中返回类型不同。那么,有没有办法执行它而不导致重写,但保持相同的名称和不同的类型?

  • 我有一个主类。应用程序中有许多子类是从类扩展而来的。base类公开公共方法,如下所示: 应用程序将在子实例上调用以获得一个检查器实例。每个子类都可以有自定义的基本检查器和验证检查器。他们可以使用和方法实现它,但是他们不能覆盖基类的,因为它包含处理逻辑。 在这里使用关键字合适吗?

  • 主要内容:如何调用被重写的方法前面讲过在 Python 中,子类继承了父类,那么子类就拥有了父类所有的类属性和类方法。通常情况下,子类会在此基础上,扩展一些新的类属性和类方法。 但凡事都有例外,我们可能会遇到这样一种情况,即子类从父类继承得来的类方法中,大部分是适合子类使用的,但有个别的类方法,并不能直接照搬父类的,如果不对这部分类方法进行修改,子类对象无法使用。针对这种情况,我们就需要在子类中重复父类的方法。 举个例子,鸟通

  • 无法使用下面的行从子类访问方法, 假设我在子类中有一个方法,而父类中没有相同的方法。在这种情况下,我们无法使用上述代码行访问子类方法print()。但是请注意,如果我们在父类中有相同的方法,那么我们可以使用上面的代码访问它。 可能没有这样的现实生活场景,但试图理解为什么我无法访问子类使用类型为父的子对象,如果我们没有在父类中定义相同的方法。 示例代码如下: 更多解释——如果我在父类中定义了方法,那

  • 为什么不可能在子类中有一个静态方法,它的签名与父类中的签名相同? 我只是想知道为什么他们允许在这里使用final修饰符?我们都知道静态方法属于一个类而不属于对象,所以不可能在子类中重写方法。所以对于我来说在这里是多余的。

  • 重载子类中重写的方法,我是重载父方法还是重载子类方法? 我大体上理解什么是超载和超驰。 重载-同一方法在同一个类中有不同的参数和可能的返回类型。 重写-子类中的方法签名与父类中的方法签名相同,但实现不同。 方法B.a(INTX)是重载a.a还是重载B.a?