Java 如何按子类调用超类参数化构造函数?
为什么在启动找不到符号的Employee构造函数时出错 建筑人Java 如何按子类调用超类参数化构造函数?,java,Java,为什么在启动找不到符号的Employee构造函数时出错 建筑人 class Person { String name = "noname"; Person(String nm) { name = nm; } } class Employee extends Person { String empID = "0000"; Employee(String eid) {// error empID = eid; }
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);
}
}
你需要打电话
super(name);
作为构造函数Employee的第一个语句,编译器将隐式调用不存在的Person的无参数构造函数
其中name是Employee的附加参数
请看一个示例,该示例显示了在没有显式超级方法调用的情况下类似示例如何失败。创建员工时,需要同时指定姓名和员工id,因为每个员工都是个人,每个人都需要姓名。Employee的构造函数可能如下所示
public Employee(String eid, String name) {
super(name);
empID=eid;
}
超行指定如何调用超类的构造函数。它需要在那里,因为没有参数的超类没有构造函数。必须调用超类构造函数,只有一个可用的构造函数,并且该构造函数需要指定name参数。您应该执行以下操作以使程序正常工作:
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);
}
}
我有几点要补充
将数据成员私有化始终是一个好习惯。如果要访问类外的成员,请使用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;
}
}
超级关键词是你的朋友。如果员工id与员工姓名不一致,那么这样做是不对的。也就是说,这个答案可能是错的,但不一定是错的。
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;
}
}