[英]Are Java constructors called upon creating a class? “constructor cannot be applied to given types” error when no object has been created
我正在从教程中重建以下代码。 当我运行 complie时,出现以下错误:
Vierbeiner类中的构造函数Vierbeiner不能应用于给定类型; 必需:找到的java.lang.String:无自变量原因:实际和正式自变量列表的长度不同
我的理解是,发生此错误是因为父类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 {
}
编辑:为了回应我得到的答案,对我来说仍然不清楚的是为什么以下(情况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{
};
在其中似乎使用在Vierbeiner类中定义的no参数构造函数创建了Hund对象。
但是,如果我取消注释以下情况(情况2),则会出现编译错误:
Hund hund3 = new Hund("doggy");
在情况1中,编译器将在父类Vierbeiner上查找无参数构造函数以创建hund2对象。 在情况2中,我希望编译器做同样的事情,那就是去父类Vierbeiner查找一个字符串参数构造函数来创建hund3对象,但是如果不使用“ super”,情况似乎并非如此。我不明白为什么。
您在编译期间收到错误,而不是运行时收到错误或异常。
这意味着代码没有被执行,因此没有创建类实例-没有任何构造函数的调用。
在编译期间,很容易检测到您正在扩展的类具有单个字符串参数构造函数,扩展类必须调用该构造函数(以便创建基础基类)。
请注意,一旦实现了构造函数, 就不能再依赖于基类的自动生成的无参数默认构造函数 -现在必须在派生类中调用基类的参数化构造函数。
由于您的代码中缺少这种实现,因此会发生您描述的错误。
一个简单的可能解决方案是提供一个默认的构造函数实现,该实现将调用基类的单个参数构造函数:
class Hund extends Vierbeiner{
Hund() {
super("DefaultName");
}
};
代码的新增功能解决了编译时错误。
一种更实用的方法是确保派生类也具有带有字符串参数的构造函数,然后可以将其传递给基类构造函数:
class Hund extends Vierbeiner{
Hund(String name) {
super(name);
}
};
参考文献:
您有一个编译时错误。 您需要在派生类中添加构造函数,并使用super
关键字调用基本clase构造函数。
class Hund extends Vierbeiner {
public Hund(String pName) {
super(pName);
}
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.