子构造函数似乎在没有调用的情况下调用Parent构造函数

时间:2014-01-15 02:22:13

标签: java constructor

所以我目前正在对我的一些代码进行错误测试,而且我似乎遇到了这个错误:

constructor Being in class Being cannot be applied to given types;
public class Monster extends Being{
   ^
required: String,String
  found: no arguments
  reason: actual and formal argument lists differ in length

以下是我的代码中的示例:(父)

public abstract class Being{
public String name;
public Race race;
public int str = 10, agi = 10, con = 10, wis = 10, HP, MP, tHP, tMP, lvl;

//Object Creator

public Being(String n, String rce){
    name = n;
    tHP = (con/2) + 10;
    tMP = (wis/2) + 10;
    HP = tHP;
    MP = tMP;
    lvl = 1;
    }
}

(儿童)

public class Monster extends Being{

private Monster m = new Monster();
}

这只是一个小例子。我在Monster.java中尝试了很多不同的方法来创建构造函数,但每次我都出现相同的错误。有人请帮忙!

4 个答案:

答案 0 :(得分:1)

每个构造函数都必须在超类中调用构造函数。如果你不调用一个,默认构造函数(no-args one)将被隐式调用。

在你的情况下,超类中没有no-args构造函数,所以你必须显式地调用String,String,例如:

public class Monster extends Being {
    public Monster() {
        super("foo", "bar");
    }
}

或在Being中声明一个no-args构造函数。

你应该记住关于java的奇怪之处是,如果你没有指定任何构造函数,那么隐式定义了一个无参数,但是当你用args定义一个构造函数时,隐式的no-args构造函数就会消失!这会抓住大多数新的java程序员。

答案 1 :(得分:1)

首先,编译器假定no-arg构造函数。也就是说,要记住Java构造函数的主要事情是,一旦定义了除no-arg构造函数之外的构造函数,任何子类都必须调用它。

因此,由于您的父类定义了一个带两个字符串的构造函数,因此您的子类必须调用它。您的选择是:

  1. 在子类
  2. 中创建双字符串构造函数
  3. 在子类中创建一些其他构造函数,但必须在父类中调用双字符串构造函数,
  4. 在父类中创建一个无参数构造函数。
  5. (可能有更多异国情调的选择,但我认为这些是前三名)

    在代码中:

    1:

    public class Monster extends Being {
      . . .
      public Monster(String n, String rce) {
        super(n, rce);
      }
      . . .
    }
    

    2:

    public class Monster extends Being {
      . . .
      public Monster() {
        super("Default n", "Default rce");
        // or
        // super(null, null);
        // or
        // super("Default n", null);
        // etc
      }
      . . .
    }
    

    3:

    public abstract class Being {
      . . .
      public Being() {
        . . .
      }
      public Being(String n, String rce) {
       . . .
      }
      . . .
    }
    . . .
    public class Monster extends Being {
    . . .
      public Monster() {
        super();
      }
    . . .
    }
    

    关键是,一旦声明了构造函数,子类就必须调用它。我想你可以从Being类中删除双字符串构造函数,但那确实是一个设计决定。

    HTH

答案 2 :(得分:0)

您应该参考a previously asked question以获取有关如何隐式调用super的构造函数的更多信息。

答案 3 :(得分:0)

  1. 显式调用Being构造函数(通过super("aname","aRace");
  2. Being
  3. 中创建无参数构造函数

    请注意,如果您选择第二个选项,namerace将为null