Java多态性问题

时间:2009-11-04 17:50:40

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

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 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分: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");
    }
}

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

public void move(double delta)

但你的孩子班级宣布:

public void move(long delta)

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

public void move(double delta)

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

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

答案 2 :(得分:2)

您需要将@Override标志添加到外星人和玩家类中的移动功能。

这会帮助你注意到你并没有完全覆盖你的行动,因为外星人/玩家的类型很长,而不是双打

答案 3 :(得分:2)

您的子类没有实现相同的方法签名:

public void move(double delta);

与:

不同
public void move(long delta);

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