【问题标题】:Java: Inherited class constructor is calling Super classJava:继承的类构造函数正在调用超类
【发布时间】:2011-11-10 02:13:05
【问题描述】:

在创建 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

为什么会这样?

【问题讨论】:

    标签: java inheritance constructor subclass superclass


    【解决方案1】:

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

    super(id);
    

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

    一般来说,如果您的构造函数不是以 super(...)this(...) 语句开头(并且您只能拥有其中一个,不能同时拥有两者),那么它默认使用 super()(不带参数) .

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        由于您没有在 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
            }
        
        }
        

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-03-31
            • 1970-01-01
            • 1970-01-01
            • 2013-02-12
            • 2015-06-29
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多