Ron*_*ald 0 java constructor compiler-errors class object
我正在从教程中重构以下代码.当我运行 complie时,我收到以下错误:
类Vierbeiner中的构造函数Vierbeiner不能应用于给定类型; required:java.lang.String found:无参数原因:实际和形式参数列表的长度不同
我的理解是发生此错误是因为父类Vierbeiner具有需要String参数的构造函数,并且没有构造函数不需要参数.我不明白的是为什么我在没有创建类Hund对象的情况下得到这个错误.当我没有创建类Hund的对象时,为什么要调用构造函数?我看到的关于此错误的每个现有问题都涉及创建子类的对象.
public class Vierbeiner {
public static void main(String[] args){
Vierbeiner hund = new Vierbeiner("Bello");
hund.rennen();
}
String vierbeinerName;
Vierbeiner(String pName) {
vierbeinerName = pName;
}
public void rennen() {
System.out.println(vierbeinerName+" rennt los!");
}
}
class Hund extends Vierbeiner {
}
Run Code Online (Sandbox Code Playgroud)
编辑:在回答我已经得到的答案时,我仍然不清楚为什么以下(案例1)编译没有问题:
public class Vierbeiner{
public static void main(String[] args){
Vierbeiner hund = new Vierbeiner();
Hund hund2 = new Hund();
// Hund hund3 = new Hund("doggy");
}
String vierbeinerName;
Vierbeiner() {
vierbeinerName = "test";
};
Vierbeiner(String pName){
}
}
class Hund extends Vierbeiner{
};
Run Code Online (Sandbox Code Playgroud)
我在其中创建了一个Hund对象,似乎使用了我在Vierbeiner类中定义的无参数构造函数.
但是如果我取消注释以下内容(案例2),我会收到编译错误:
Hund hund3 = new Hund("doggy");
Run Code Online (Sandbox Code Playgroud)
在案例1中,编译器查找父类Vierbeiner以查找无参数构造函数以创建hund2对象.在第2种情况下,我希望编译器做同样的事情,那就是去父类Vierbeiner找到一个字符串参数构造函数来创建hund3对象,但是如果不使用"super"就不会出现这种情况.我不明白为什么.
您在编译期间收到错误,而不是运行时的错误或异常.
这意味着代码没有被执行,因此没有创建类实例 - 没有任何构造函数的调用.
在编译期间,很容易检测到您正在扩展一个具有单个字符串参数构造函数的类,扩展类必须调用该类(为了创建底层基类).
请注意,一旦实现了构造函数,就不能再依赖基类的自动生成的无参数默认构造函数 - 现在必须在派生类中调用基类的参数化构造函数.
由于您的代码中缺少此类实现 - 您所描述的错误会发生.
一个简单的可能解决方案是提供一个默认的构造函数实现,它将调用基类的单个参数构造函数:
class Hund extends Vierbeiner{
Hund() {
super("DefaultName");
}
};
Run Code Online (Sandbox Code Playgroud)
对代码的这一添加解决了编译时错误.
更实用的方法是确保派生类具有带字符串参数的构造函数,然后可以将其传递给基类构造函数:
class Hund extends Vierbeiner{
Hund(String name) {
super(name);
}
};
Run Code Online (Sandbox Code Playgroud)
参考文献: