所以我目前正在对我的一些代码进行错误测试,而且我似乎遇到了这个错误:
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中尝试了很多不同的方法来创建构造函数,但每次我都出现相同的错误。有人请帮忙!
答案 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:
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)
Being
构造函数(通过super("aname","aRace");
)Being
请注意,如果您选择第二个选项,name
和race
将为null