- 当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定
- 当调用对象属性时,没有动态绑定机制,哪里声明,哪里就使用
2.例题
//题目描述
1.定义员工类Employee,包含姓名和月工资[private],以及计算年工资getAnnual的方法。
2.普通员工和经理继承了员工,经理类多了奖金bonus属性和管理manage方法,普通员工类多了work方法。
3.普通员工和经理类要求分别重写getAnnual方法
4.测试类中添加一个方法showEmpAnnual(Employee e), 实现获取任何员工对象的年工资,并在main方法中调用该方法[e.getAnnua()]
5.测试类中添加一个方法,testWork,如果是普通员工,则调用work方法, 如果是经理,则调用manage方法
源代码
//测试类
package com.emp;
import com.polyparameter_.Wordks;
public class TextEmp {
public static void main(String[] args) {
Manager manager = new Manager("李强",8000,20000);
Work work = new Work("张三",5000);
TextEmp text = new TextEmp(); //这里必须new 创建方法空间才能将员工传入TextEmp方法中
text.testWork(manager);
text.showEmpAnnual(manager); //动态绑定机制,.的是方法,在运行类型中查找
text.testWork(work);
text.showEmpAnnual(work);
}
//testWork 方法调用的是子级的方法,要才能进行向下转型
public void testWork(Employee e ) {
if(e instanceof Manager) {
((Manager)e).manage();
}
else if(e instanceof Work) {
((Work)e).work();
}
else{
System.out.println("暂无此类员工!");
}
}
public void showEmpAnnual(Employee e) {
System.out.println(e.getName()+"的年薪为:"+ e.getAnnual()+"钱");//动态绑定机制
}
}
//Employee 类
package com.emp;
public class Employee {
private String name; // 姓名
private double mothSalary; //月工资
// 无参构造
public Employee() {}
// 构造函数
public Employee(String name, double mothSalary) {
this.name = name;
this.mothSalary = mothSalary;
}
// 计算年工资方法,返回值为double
public double getAnnual() {
return 12*mothSalary;
}
//get/set 方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getMothSalary() {
return mothSalary;
}
public void setMothSalary(double mothSalary) {
this.mothSalary = mothSalary;
}
}
//Manager类
package com.emp;
public class Manager extends Employee{
private double bonus; //经理的年终奖金
// 无参构造
public Manager() {}
// 构造函数
public Manager(String name, double mothSalary, double bonus) {
super(name, mothSalary); //super 继承父级属性
this.bonus = bonus;
}
//manage 方法
public void manage() {
System.out.println("经理:"+getName()+":do management~");
}
// 重写年薪方法@Override关键字,通过重写的规则去验证方法
@Override
public double getAnnual() {
return super.getAnnual()+bonus;
}
// get/set 方法
public double getBonus() {
return bonus;
}
public void setBonus(double bonus) {
this.bonus = bonus;
}
}
//Work类
package com.emp;
public class Work extends Employee {
// 无参构造
public Work() {}
// 构造函数
public Work(String name, double mothSalary) {
super(name, mothSalary);
}
public void work() {
System.out.println("员工:"+getName()+":is working~");
}
// 重写年薪方法
@Override
public double getAnnual() {
return super.getAnnual();
}
}
运行结果: