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个参数.
这是怎么回事?有人可以帮我这个吗?
我不确定我理解你所说的内容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是抽象的.
| 归档时间: |
|
| 查看次数: |
1034 次 |
| 最近记录: |