繁体   English   中英

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

[英]Java: Inherited class constructor is calling Super class

在创建Java程序时,我遇到了一个问题,

子类构造函数通过调用超类的方法抛出错误

代码类似于以下内容:

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

为什么会这样?

超类没有默认的构造函数。 因此,您需要将适当的构造函数参数传递给超类:

super(id);

(在ManagerEngineer构造函数中,将其作为第一行。)在两种情况下,您还都应删除this.emp_id = id行。

通常,如果您的构造函数不是以super(...)this(...)语句开头(并且您只能使用其中之一,不能同时使用两者),则默认使用super() (带有没有参数)。

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

由于未在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并定义了一个读取方法。 似乎该领域是私有的。 否则,您可以直接访问。

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

class Manager extends Employee {

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

}

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

在Java中,子类构造函数始终调用其父类的构造函数之一。 这对于正确初始化该类是必要的。 即使是子类,也必须设置字段和状态,这就是在Java中的工作方式。 如果没有明确指定,则它正在调用默认的no-arg构造函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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