6

我有一个扩展实体的类 Player:

玩家:

public class Player extends Entity {
    public Player(char initIcon, int initX, int initY) {
        //empty constructor
    }
...

实体:

public Entity(char initIcon, int initX, int initY) {
        icon = initIcon;
        x = initX;
        y = initY;
    }
...

这几乎是您所期望的,但是在编译时我收到一个错误,内容为

Player.java:2: error: constructor Entity in class Entity cannot be applied to the given types:
    public Player(char initIcon, int initX, int initY)
required: char,int,int
found: no arguments
reason: actual and formal argument lists differ in length

但它显然确实有必要的论据。这里发生了什么?谢谢!

4

5 回答 5

14

您需要通过调用其构造函数来初始化超类super

public Player(char initIcon, int initX, int initY) {
    super(initIcon, initX, initY);
}
于 2012-12-19T15:24:07.910 回答
7

您的超类构造函数有 3 个参数,并且似乎没有空构造函数。因此,您的子类构造函数应该显式调用传递值的超类构造函数。

public class Player extends Entity {
    public Player(char initIcon, int initX, int initY) {
        //empty constructor
        super(initIcon,initX,initY);
    }
...
于 2012-12-19T15:23:59.050 回答
2

没有对超级构造函数的显式调用(如其他答案或下面所示),因此 VM 将使用隐式 0-arg 构造函数……但此构造函数不存在。因此,您必须对有效的超级构造函数进行显式调用:

 public class Player extends Entity {
    public Player(char initIcon, int initX, int initY) {
        super(initIcon,initX,initY);
    }
于 2012-12-19T15:51:37.803 回答
2

您需要从扩展类的构造函数中显式调用基类的构造函数。你这样做:

public class Player extends Entity {
    public Player(char initIcon, int initX, int initY) {
        super(initIcon, initX, initY);
        // rest of player-specific constructor
    }
于 2012-12-19T15:24:53.587 回答
0

当子类继承父类时,默认调用父类的默认构造函数。在上述情况下,您已经在 Parent 类中定义了参数构造函数,因此 JVM 不提供默认值,并且您的子类正在调用那里不存在的父默认构造函数。要么在 Parent 类中指定默认构造函数,要么使用 super 调用父类的 Parametric 构造函数。

public class Player extends Entity {
public Player()
{}
public Player(char initIcon, int initX, int initY) {
    //empty constructor
}

或者

public Player
(char initIcon, int initX, int initY) {
super(initIcon, initX, initY);
}
于 2012-12-19T16:06:11.443 回答