在Java中找不到符号构造函数

时间:2011-08-08 06:30:47

标签: java

我得到的找不到符号 - 构造函数占用者(位置) 当我尝试编译子类Animal of Occupant

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;

}

为什么我会收到此错误?感谢

9 个答案:

答案 0 :(得分:3)

正如所有其他答案正确地指出你应该用三个参数调用单个超级构造函数,而不是一次尝试一个参数,值得一提的是构造函数只能有一次 super(...)来电或一次 this(...)来电。

每个构造函数(Object本身除外)都只执行一个链接操作:

  • 隐含地,如果您不指定任何其他内容,则可以链接到无参数的超级构造函数。所以:

    Foo(int x)
    {
    }
    

    相当于

    Foo(int x)
    {
        super();
    }
    

    ...显然必须 一个可访问的无参数构造函数

  • 根据您的示例

  • ,它可以显式链接到超级构造函数
  • 它可以链接到同一个类中的另一个构造函数,例如

    Foo()
    {
        this(10);
    }
    

    类中的链接不允许引起循环。 (你不能有两个相互链接的构造函数。)

在执行任何变量初始值设定项之前发生链接,必须在构造函数体的开头出现,并且再次,上面的选项中只有一个

答案 1 :(得分:2)

super(position)使用一个参数调用父类型的构造函数。由于不存在一个参数构造函数,因此编译失败。试试这个:

super(position,name,description);

答案 2 :(得分:2)

因为您正在调用父类的构造函数,它们不存在:

super(position);
super(name);
super(description);

答案 3 :(得分:2)

你得到这个错误,因为当你打电话给super(...)时,你实际上是在呼叫乘员(...)。由于Occupant(...)有3个参数,super(...)也必须。尝试使用:

super(position, name, description);

答案 4 :(得分:1)

替换

super(position);
super(name);
super(description);

super(position, name, description);

答案 5 :(得分:1)

没有类Occupant的构造函数接收1个参数。

此:

super(position);
super(name);
super(description);

应该是:

super(position, name, description);

答案 6 :(得分:1)

你不能用这种方式调用sup construcot。

请使用

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;

        }

答案 7 :(得分:1)

这是因为在super中使用了Animal

您的Occupant类的构造函数为Position, String, String,因此您的超级应该传递相同的值。

以下super次调用指向不存在的Occupant构造函数。

super(position);
super(name);
super(description);

解决方案:通过传递相关字段(如上所述)来调用超类构造函数。

public Animal(Position position, String name, String description, double dangerLevel) {
    super(position, name, description);
    // other declarations..
}

答案 8 :(得分:1)

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