Java 如何按子类调用超类参数化构造函数?

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; }

为什么在启动找不到符号的Employee构造函数时出错 建筑人

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;
    }
}