为什么我在找不到符号的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);
}
}
答案 0 :(得分:5)
您需要致电
super(name);
作为构造函数Employee
的第一个语句,因为编译器将以其他方式隐式调用不存在的Person
的无参数构造函数
其中name
是Employee
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);
}
}
我有几点需要补充。
制作数据成员private
始终是一个好习惯。如果要访问类外的成员,请使用getter和setter。 (getName()
,setName()
等)
如果要在不使用参数化构造函数的情况下创建对象,则必须定义构造函数(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;
}
}