抽象类构造函数初始化

时间:2013-12-12 13:07:51

标签: java class oop inheritance abstract-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);
    }
}

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

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

2 个答案:

答案 0 :(得分:5)

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

Employee e = new Salary("John Adams", "Boston, MA", 2, 2400.00);

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

的变量中

正如托马斯指出的那样,这个会调用基类3参数构造函数:

Employee e = new Employee("John Adams", "Boston, MA", 2);

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

答案 1 :(得分:1)

在这两种情况下,您都在创建Salary类的实例,因此被调用的构造函数来自Salary类。