Java实际参数与正式参数不匹配,但它们呢?

时间:2012-12-19 15:22:16

标签: java inheritance constructor arguments

我有一个扩展实体的类播放器:

播放器:

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

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

5 个答案:

答案 0 :(得分:13)

您需要通过使用super

调用其构造函数来初始化超类
public Player(char initIcon, int initX, int initY) {
    super(initIcon, initX, initY);
}

答案 1 :(得分:7)

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

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

答案 2 :(得分:2)

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

public class Player extends Entity {
    public Player(char initIcon, int initX, int initY) {
        super(initIcon, initX, initY);
        // rest of player-specific constructor
    }

答案 3 :(得分:2)

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

 public class Player extends Entity {
    public Player(char initIcon, int initX, int initY) {
        super(initIcon,initX,initY);
    }

答案 4 :(得分:0)

当Child类继承父类时,默认情况下会调用父类的默认构造函数。 在上面的例子中,您已经在Parent类中定义了参数化构造函数,因此JVM不提供default,并且您的子类正在调用那里不存在的父默认构造函数。 在Parent类中指定默认构造函数,或使用super。

调用父项的Parametric构造函数
public class Player extends Entity {
public Player()
{}
public Player(char initIcon, int initX, int initY) {
    //empty constructor
}

OR

public Player
(char initIcon, int initX, int initY) {
super(initIcon, initX, initY);
}