抽象类构造函数初始化

Jav*_*ent 2 java oop inheritance abstract-class class

我看起来简单的抽象示例如下,

public abstract class Employee {
    private String name;
    private String address;
    private int number;

    public Employee(String name, String address, int number) {
        System.out.println("Constructing an Employee");
        this.name = name;
        this.address = address;
        this.number = number;
    }
}

public class Salary extends Employee {
    private double salary; //Annual salary

    public Salary(String name, String address, int number, double salary) {
        super(name, address, number);
        setSalary(salary);
    }
}

public class AbstractDemo {
    public static void main(String[] args) {
        Salary s = new Salary("Mohd Mohtashim", "Ambehta, UP", 3, 3600.00);
        Employee e = new Salary("John Adams", "Boston, MA", 2, 2400.00);
    }
}
Run Code Online (Sandbox Code Playgroud)

这里我有一个抽象基类和具体的子类.抽象类在构造函数中有3个参数,子类有4个,但是当我在main方法中初始化抽象类和具体类时,两个构造函数都传递了4个参数并且使用setSalary()方法我能够计算两者的工资s,e甚至认为员工抽象类只需要3个参数.

这是怎么回事?有人可以帮我这个吗?

Typ*_*eIA 5

我不确定我理解你所说的内容computesalary()(这不在你的示例代码中),但我怀疑这一行可能存在混淆:

Employee e = new Salary("John Adams", "Boston, MA", 2, 2400.00);
Run Code Online (Sandbox Code Playgroud)

在这里,请注意,即使您将引用分配给类型的变量Employee,您仍然在创建一个Salary对象.因此,您仍然可以调用Salary派生类的构造函数,该构造函数具有4个参数.这行代码与它上面的行完全相同,并执行完全相同的代码路径.唯一的区别是对新创建的对象的引用存储在具有基类类型的变量中.

正如Thomas指出的那样,将调用基类3参数构造函数:

Employee e = new Employee("John Adams", "Boston, MA", 2);
Run Code Online (Sandbox Code Playgroud)

但这不是有效的代码,因为它Employee是抽象的.