我已经用瑞典语学会了所有这些编程术语,所以请耐心听我说。。
我在调用子类中的方法时遇到问题,该子类应该重写超类中的方法。
以下是已删除代码的类结构:
public interface Movable {
public void move(double delta);
}
public abstract class Unit implements Movable, Viewable{
public void move(double delta){
System.out.println("1");
}
}
public class Alien extends Unit{
public void move(long delta){
System.out.println("2");
}
}
public class Player extends Unit{
public void move(long delta){
System.out.println("3");
}
}
public void main(){
ArrayList<Unit> units = new ArrayList<Unit>();
Unit player = new Player();
Unit alien = new Alien();
units.add(player);
units.add(alien);
for (int i = 0; i < this.units.size(); i++) {
Unit u = (Unit) this.units.get(i);
u.move();
}
}
这将输出1和1,但我希望它输出2和3。
我做错什么了?我以为是这样的。
4条答案
按热度按时间ippsafx71#
您的子类(alien和player)没有重写其父类中的move()方法,因为您已将“delta”声明为long而不是double。
您可以让编译器使用@override注解来发现其中的一些错误。
zfycwa2u2#
这是您的问题,在接口中,您将move声明为:
但您的子类声明:
这将创建一个新函数,与move分开,并且不会覆盖它。要修复它,请将外星人和玩家的移动功能更改为:
另外,正如outlaw programmer所指出的,您可以通过在父类中要重写函数的任何函数声明的正上方添加@override注解来让编译器捕获此类错误。像这样:
ggazkfy83#
你需要在外星和玩家类中的move函数中添加@override标志。
这会帮助你注意到你没有完全覆盖你的移动,因为外星人/玩家的类型是长的,而不是双打
8cdiaqws4#
子类未实现相同的方法签名:
不同于:
要在编译时捕获此类错误,可以在方法签名中添加@override。编译器将检查子类是否确实重写父类中的方法。