Java多态性问题

Bav*_*sjo 2 java polymorphism

我已经用瑞典语学习了所有这些编程术语,所以请耐心等待..

我在调用子类中的方法时遇到问题,该方法应该覆盖超类中的方法.

这是删除代码的类结构:

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");
    }
}
Run Code Online (Sandbox Code Playgroud)
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();
    }
}
Run Code Online (Sandbox Code Playgroud)

这将输出1和1,但我希望它输出2和3.
我做错了什么?我认为这是它的工作原理.

Out*_*mer 12

您的子类(Alien和Player)不会覆盖其父类中的move()方法,因为您已将'delta'声明为long而不是double.

您可以使用@Override注释让编译器发现其中一些错误.


Dan*_*ham 12

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

这是您的问题,在您移动的界面中声明为:

public void move(double delta)
Run Code Online (Sandbox Code Playgroud)

但是您的子课程声明:

public void move(long delta)
Run Code Online (Sandbox Code Playgroud)

这创建了一个新的功能,与移动分开并且不会覆盖它.要修复它,将Alien和Player的移动功能更改为:

public void move(double delta)
Run Code Online (Sandbox Code Playgroud)

此外,正如Outlaw Programmer所指出的,你可以让编译器通过在你想要覆盖父类中的函数的任何函数的声明的正上方添加@Override注释来捕获这种错误.像这样:

public class Alien extends Unit {
    @Override
    public void move(double delta) {
        System.out.println("2");
    }
}
Run Code Online (Sandbox Code Playgroud)