如何通过子类调用超类参数化构造函数?

时间:2014-01-15 19:16:01

标签: java

为什么我在找不到符号的Employee构造函数的启动时收到错误 constuctor人?

class Person {
    String name = "noname";

    Person(String nm) {
        name = nm;
    }
}

class Employee extends Person {
    String empID = "0000";

    Employee(String eid) {// error
        empID = eid;
    }
}

public class EmployeeTest {
    public static void main(String args[]) {
        Employee e1 = new Employee("4321");
        System.out.println(e1.empID);
    }
}

3 个答案:

答案 0 :(得分:5)

您需要致电

super(name);

作为构造函数Employee的第一个语句,因为编译器将以其他方式隐式调用不存在的Person的无参数构造函数

其中nameEmployee

的附加参数
Employee(String eid, String name) {
    super(name);
    empID = eid;
}

查看示例8.2-1 from the JLS,其中显示了在没有明确super方法调用的情况下类似示例如何失败。

答案 1 :(得分:2)

当您创建员工时,您需要同时指定姓名和员工ID - 因为每个员工都是一个人,每个人都需要一个名字。 Employee的构造函数可能看起来像这样。

public Employee(String eid, String name) {
    super(name);
    empID=eid;
}

super行指定如何调用超类的构造函数。它需要在那里,因为没有参数的超类没有构造函数。必须调用超类构造函数,只有一个可用的构造函数,并且该构造函数需要指定name参数。

答案 2 :(得分:1)

你应该做这样的事情来让你的程序运作:

class Person {
    String name = "noname";
    Person(String name) {
        this.name = name;
    }
}

class Employee extends Person {
    String empID = "0000";

    Employee(String empID , String name) {
        super(name);
        this.empID = empID;
    }
}

public class EmployeeTest {
    public static void main(String args[]) {
        Employee e1 = new Employee("4321" , "Ramesh");
        System.out.println(e1.empID);
        System.out.println(e1.name);
    }
} 

我有几点需要补充。

  1. 制作数据成员private始终是一个好习惯。如果要访问类外的成员,请使用getter和setter。 (getName()setName()等)

  2. 如果要在不使用参数化构造函数的情况下创建对象,则必须定义构造函数(Person()Employee())。如果要使用非参数化构造函数进行实例化,则不会为您提供默认的contstructor。每当你使用参数化构造函数作为一个好习惯时,这样做是这样的:

    class Person {
        private String name = "noname";
        Person() {}
        Person(String name) {
            this.name = name;
        }
        public String getName() {
            return this.name;
        }
        public void setName(String name) {
            this.name = name;
        }
    }
    
    
    class Employee extends Person {
        private String empID = "0000";
        Employee() {}
        Employee(String empID,String name) {
            this.empID = empID;
        }
        public String getEmpID() {
            return this.empID;
        }
        public void setName(String empID) {
            this.empID = empID;
        }
    }