多态的应用-多态参数

多态的应用-多态数组

  • 多态数组
    • 数组的定义类型为父类型,里面保存的实际元素类型是子类类型
  • 多态参数
    • 方法定义的形参类型为父类型,实参类型允许为子类型

定义员工类 Employee,包含姓名和月工资【private】,以及计算年工资 getAnnual 的方法。普通员工和经历继承了员工,经理类多了奖金 bonus 属性和 管理 manage 方法普通员工类多了 work 方法,普通员工和经理类要求重写 getAnnual 方法测试类中添加一个方法 showEmpAnnual(Employee e)。实现获取任何员工对象的年工资,并在 main 方法中该方法 [e.getAnnual()] 测试类中添加一个方法,testWork,如果是普通员工,则调用 work 方法,如果是经理,则调用 manage 方法。

Employee.java

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 void setname(String name){
		this.name = name;
	}

	public String getname(){
		return name;
	}

	public void setsalary(double salary){
		this.salary = salary;
	}

	public double getsalary(){
		return  salary;
	}

}

Manager.java

public class Manager extends Employee{

	private double bonus;

	public Manager(String name, double salary, double bonus){
		super(name, salary);
		this.bonus = bonus;
	}

	public void setbonus(double bonus){
		this.bonus = bonus;
	}

	public double getbonus(){
		return bonus;
	}

	public void manage(){
		System.out.println("Manager " + getname() + " is managing.");
	}

	// overwrite getAnnual()
	public double getAnnual(){ 
		return super.getAnnual()+bonus;
	} 
}

Worker.java

public class Worker extends Employee{
	public Worker(String name, double salary){
		super(name, salary);
	}

	public void work(){
		System.out.println("worker " + getname() + " is working ");
	}

	public double getAnnual(){
		return super.getAnnual();
	}
}

mains.java

/*
	定义员工类 Employee,包含姓名和月工资【private】,
	以及计算年工资 getAnnual 的方法。普通员工和经历
	继承了员工,经理类多了奖金 bonus 属性和 管理 manage 方法
	普通员工类多了 work 方法,普通员工和经理类要求重写 getAnnual 方法

	测试类中添加一个方法 showEmpAnnual(Employee e)。实现获取任何员工
	对象的年工资,并在 main 方法中该方法 [e.getAnnual()]

	测试类中添加一个方法,testWork,如果是普通员工,则调用 work 方法,
	如果是经理,则调用 manage 方法。 
 */

public class mains{
	public static void main(String[] args) {
		Worker tom = new Worker("tom", 2500);
		Manager milan = new Manager("milan", 5000, 200000);
		mains mains = new mains();
		mains.showEmpAnnual(tom);
		mains.showEmpAnnual(milan);


		mains.testWork(tom);
	}

	/*
	测试类中添加一个方法 showEmpAnnual(Employee e)。实现获取任何员工
	对象的年工资,并在 main 方法中该方法 [e.getAnnual()]
	*/

	public void showEmpAnnual(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("...");
		}
	}

}

30000.0
260000.0
worker tom is working
posted @ 2024-05-13 16:05  takenika  阅读(19)  评论(0)    收藏  举报