[英]cannot find symbol - constructor in Java
我尝试编译子类Animal of Occupant时遇到了找不到符号-构造函数Occupant(Position)
public class Occupant
{
protected Position position;
public String string=" ";
protected String name;
protected String description;
public Occupant(Position position, String name, String description){
this.position=position;
this.name=name;
this.description=description;
}
public class Animal extends Occupant
{
protected String name;
protected String description;
protected double dangerLevel;
protected String stringRepresentation;
protected Position position;
public Animal(Position position, String name, String description, double dangerLevel) {
super(position);
super(name);
super(description);
this.position=position;
this.dangerLevel=dangerLevel;
this.name=name;
this.description=description;
}
为什么会出现此错误? 谢谢
以及所有其他正确回答的问题,您应该使用三个参数调用单个超级构造函数,而不是一次尝试一个参数,值得一提的是构造函数只能具有一个 super(...)
呼叫或一个 this(...)
呼叫。
每个构造函数( Object
本身除外)仅执行一个链接操作:
隐式地,如果您未指定其他任何内容,则可以链接到无参数的超级构造函数。 所以:
Foo(int x) { }
相当于
Foo(int x) { super(); }
...因此显然必须要有一个可访问的无参数构造函数
根据您的示例,它可以显式链接到超级构造函数
它可以链接到同一类中的另一个构造函数,例如
Foo() { this(10); }
一个类中的链接不允许引起循环。 (您不能有两个相互链接的构造函数。)
执行任何变量初始化之前发生的链接,有来在构造函数体的开始,并再次, 恰好有上述选项之一 。
super(position)
使用一个参数在父类型上调用构造函数。 由于一个参数构造函数不存在,因此编译失败。 尝试以下方法:
super(position,name,description);
因为您正在调用父类的构造函数,所以它们不存在:
super(position);
super(name);
super(description);
之所以会出现此错误,是因为当您调用super(...)时,实际上是在调用Occupant(...)。 由于Occupant(...)具有3个参数,因此super(...)也必须如此。 尝试使用:
super(position, name, description);
更换
super(position);
super(name);
super(description);
与
super(position, name, description);
接收1个参数的Occupant
类的no构造函数。
这个:
super(position);
super(name);
super(description);
应该 :
super(position, name, description);
您不能以这种方式调用sup construcotr。
请用
public Animal(Position position, String name, String description, double dangerLevel) {
super(position, name, description);
this.position = position;
this.dangerLevel = dangerLevel;
this.name = name;
this.description = description;
}
这是因为在Animal
使用了super
。
您的Occupant
类具有Position, String, String
的构造函数,因此您的super应该传递相同的值。
以下super
调用指向不存在的Occupant
构造函数。
super(position);
super(name);
super(description);
解决方案:通过传递相关字段来调用超类构造函数(如上所述)。
public Animal(Position position, String name, String description, double dangerLevel) {
super(position, name, description);
// other declarations..
}
public Occupant(Position position, String name, String description);
父类构造函数使用三个参数,但是您只是从派生类传递一个参数。
public Animal(Position position, String name, String description, double dangerLevel)
{
super(position); // Just passing one.
super(position, name, description); // Do this instead
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.