我看起来简单的抽象示例如下,
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我能够计算s
和e
的工资,甚至认为Employee抽象类只需要3个参数。
这是怎么回事?有人可以帮我这个吗?
答案 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类。