java多态性问题

ttvkxqim  于 2021-06-30  发布在  Java
关注(0)|答案(4)|浏览(333)

我已经用瑞典语学会了所有这些编程术语,所以请耐心听我说。。
我在调用子类中的方法时遇到问题,该子类应该重写超类中的方法。
以下是已删除代码的类结构:

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。
我做错什么了?我以为是这样的。

ippsafx7

ippsafx71#

您的子类(alien和player)没有重写其父类中的move()方法,因为您已将“delta”声明为long而不是double。
您可以让编译器使用@override注解来发现其中的一些错误。

zfycwa2u

zfycwa2u2#

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");
    }
}

这是您的问题,在接口中,您将move声明为:

public void move(double delta)

但您的子类声明:

public void move(long delta)

这将创建一个新函数,与move分开,并且不会覆盖它。要修复它,请将外星人和玩家的移动功能更改为:

public void move(double delta)

另外,正如outlaw programmer所指出的,您可以通过在父类中要重写函数的任何函数声明的正上方添加@override注解来让编译器捕获此类错误。像这样:

public class Alien extends Unit {
    @Override
    public void move(double delta) {
        System.out.println("2");
    }
}
ggazkfy8

ggazkfy83#

你需要在外星和玩家类中的move函数中添加@override标志。
这会帮助你注意到你没有完全覆盖你的移动,因为外星人/玩家的类型是长的,而不是双打

8cdiaqws

8cdiaqws4#

子类未实现相同的方法签名:

public void move(double delta);

不同于:

public void move(long delta);

要在编译时捕获此类错误,可以在方法签名中添加@override。编译器将检查子类是否确实重写父类中的方法。

相关问题