Java:继承的类构造函数正在调用Super类

时间:2011-09-04 12:57:58

标签: java inheritance constructor subclass superclass

创建java程序时遇到问题,

子类构造函数通过调用Superclass的方法

来抛出Error

代码与此类似:

class Manage
{
    public static void main(String[] args) 
    {
        Manager m1 = new Manager ( 35 );
    }
}

class Employee
{
        int emp_id;
        public Employee(int id)
        {
                this.emp_id = id;
        }
        public int get_id()
        {
                return emp_id;
        }

}
class Manager extends Employee
{
        public Manager(int id )
        {
                this.emp_id = id ;
        }
}

class Engineer extends Employee
{
        public Engineer(int id)
        {
                this.emp_id = id ;
        }
}

错误是这样的:

$ javac app.java 
app.java:25: cannot find symbol
symbol  : constructor Employee()
location: class Employee
        {
        ^
app.java:33: cannot find symbol
symbol  : constructor Employee()
location: class Employee
        {
        ^
2 errors

为什么会这样?

4 个答案:

答案 0 :(得分:8)

超类没有默认构造函数。所以你需要将适当的构造函数参数传递给超类:

super(id);

(将此作为ManagerEngineer构造函数的顶行。)在两种情况下,您还应删除this.emp_id = id行。

通常,如果您的构造函数不是以super(...)this(...)语句开头(并且您只能拥有其中一个,而不是两者),那么它默认使用{{1} (没有参数)。

答案 1 :(得分:3)

由于您已经指定了带参数的构造函数,因此Java不提供没有参数的默认构造函数。您应该自己创建一个,或者显式调用您创建的构造函数,方法是使用super(id)作为扩展类构造函数中的第一行。

答案 2 :(得分:1)

由于您未在Employee

中定义默认构造函数(无参数),因此生成错误
class Employee {

    private int emp_id;

    public Employee() {
    }

    public Employee(int id)  {
            this.emp_id = id;
    }

    public int get_id() {
            return emp_id;
    }

}

但需要考虑几点:您通过构造函数设置emp_id并定义了一个getter来读取它。这个领域似乎是私人的。否则你可以直接访问。

您在Employee中已经有一个构造函数设置ID,无需在同一个类中定义相同的构造函数。只需使用超类的构造函数。

class Manager extends Employee {

    public Manager(int id ) {
        super(id);  // calls the superclass constructor
    }

}

在这种情况下,您不需要默认构造函数。

答案 3 :(得分:1)

在java中,子类构造函数总是调用其父类的构造函数之一。这是正确初始化类的必要条件。即使它是子类,也必须设置字段和状态,这就是它在java中的完成方式。如果没有显式指定,则调用默认的no-arg构造函数。