繁体   English   中英

找不到符号-Java中的构造函数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM