【问题标题】:Java actual arguments don't match formal arguments, but they do?Java 实际参数与形式参数不匹配,但它们匹配吗?
【发布时间】:2012-12-06 23:45:39
【问题描述】:

我有一个扩展实体的 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

但它显然确实具有所需的参数。这里发生了什么?谢谢!

【问题讨论】:

  • 你为什么不做super(chat, int, int)

标签: java inheritance constructor arguments


【解决方案1】:

你需要用super调用它的构造函数来初始化超类

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          当子类继承父类时,默认调用父类的默认构造函数。 在上述情况下,您已经在 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);
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-08-22
            • 2013-02-15
            • 2014-04-26
            • 1970-01-01
            相关资源
            最近更新 更多