方法定义的形参类型为父类类型,实参类型允许为子类类型。
案例
- 定义员工类Employee,包含姓名和月工资【private】,以及计算年工资getAnnual的方法。普通员工和经理继承了员工,经理类多了奖金bonus属性和管理manage方法,普通员工多了work方法,普通员工和经理要求分别重写getAnnual方法。
- 测试类中添加一个方法showEmpAnnual(Employee e),实现获取任何员工对象的年工资,并在main方法中调用该方法(e.getAnnual())
- 测试类中添加一个方法,testWork,如果是普通员工,则调用work方法,如果是经理,则调用manage方法。
Employee
package test;public class Employee { private String name; private double salary; public Employee(String name, double salary) { this.name = name; this.salary = salary; } //得到年工资的方法 public double getAnnual() { return 12 * salary; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; }}
Manager
package test;public class Manager extends Employee{ private double bonus; public Manager(String name, double salary, double bonus) { super(name, salary); this.bonus = bonus; } public double getBonus() { return bonus; } public void setBonus(double bonus) { this.bonus = bonus; } public void manage() { System.out.println("经理 " + getName() + " is managing"); } //重写获取年薪方法 @Override public double getAnnual() { return super.getAnnual() + bonus; }}
Worker
package test;public class Worker extends Employee { public Worker(String name, double salary) { super(name, salary); } public void work() { System.out.println("普通员工 " + getName() + " is working"); } @Override public double getAnnual() { //因为普通员工没有其它收入,则直接调用父类方法 return super.getAnnual(); }}
Main
package test;public class Main { public static void main(String[] args) { Worker tom = new Worker("tom", 2500); Manager milan = new Manager("milan", 5000, 200000); Main main = new Main(); main.showEmpAnual(tom); main.showEmpAnual(milan); main.testWork(tom); main.testWork(milan); } //showEmpAnnual(Employee e) //实现获取任何员工对象的年工资,并在main方法中调用该方法 [e.getAnnual()] public void showEmpAnual(Employee e){ System.out.println(e.getAnnual());//动态绑定机制 } //添加一个方法,testWork,如果是普通员工,则调用work方法,如果是经理,则调用manage方法 public void testWork(Employee e) { if(e instanceof Worker) { ((Worker) e).work();//有向下转型操作 } else if(e instanceof Manager) { ((Manager) e).manage();//有向下转型操作 } else { System.out.println("不做处理..."); } }}
