Java学习笔记:继承与多态

在这个星期的Java课实验课中,实验内容是继承与多态,当我刚看到题目时,竟然不知道该从何处下手,最近一个月在忙着做安卓,一直也没写博客学习笔记,Java也没怎么认真看,一个暑假的学习竟然忘了不少,实在是捡了芝麻丢了西瓜。在思考了一个多小时之后,并且是在把书中关于继承与多态的部分又看了一遍后,才终于有了思路。好了废话不多说,让我们看一下这道题。

Cola公司的雇员分为以下若干类:(知识点:多态)
(1) ColaEmployee :这是所有员工总的父类,属性:员工的姓名,员工的生日月份。
方法:getSalary(int month) 根据参数月份来确定工资,如果该月员工过生日,则公司会额外奖励100 元。
(2) SalariedEmployee : ColaEmployee 的子类,拿固定工资的员工。
属性:月薪
(3) HourlyEmployee :ColaEmployee 的子类,按小时拿工资的员工,每月工作超出160 小时的部分按照1.5 倍工资发放。
属性:每小时的工资、每月工作的小时数
(4) SalesEmployee :ColaEmployee 的子类,销售人员,工资由月销售额和提成率决定。
属性:月销售额、提成率
(5) 定义一个类Company,在该类中写一个方法,调用该方法可以打印出某月某个员工的工资数额,写一个测试类TestCompany,在main方法,把若干各种类型的员工放在一 个ColaEmployee 数组里,并单元出数组中每个员工当月的工资。

在刚开始拿到这道题时,我在如何写Company类处卡住了,不知道在TestCompany类中如何去调用Company中的方法,不知道Company类中的打印工资的方法该怎么写,当时我想的是,因为ColaEmloyee数组储存的是不同种类型的数据,虽然整个数组是ColaEmployee类的,可以Company类中的方法定义一个ColaEmployee的形参,但又该怎么输出呢,因为每种员工的工资计算方式是不一样的,所以我就在这里卡住了。但我在看了一遍书后,才想起来可以在ColaEmployee类中写一个getSalary()输出奖励的工资,然后在ColaEmployee的子类中,即各类员工的类中去通过使用Override来重载父类中的getSalary方法,同时通过super调用父类的getSalary方法来输出奖励工资,而同时又能根据不同员工的类型来输出工资,然后再在Company方法中去调用对象的getSalary方法。

代码如下:

ColaEmployee类:

public class ColaEmployee {

	public String name;
	
	public int birth;
	
	public double getSalary(int month){
		double s=0;
		if(this.birth==month){
			s=100;
		}
		return s;
	}

}

SalriedEmployee类:

public class SalariedEmployee extends ColaEmployee{
	
	public double salary_month;
	
	@Override
	public double getSalary(int month){
		return salary_month + super.getSalary(month); 
		
	}

}

HourlyEmployee类:

public class HourlyEmployee extends ColaEmployee{

	public double salary_hour;
	public double hour;
	
	@Override
	public double getSalary(int month){
		
		 if (hour > 160)  
	        {  
	            return (float) (salary_hour * 160 + (hour - 160) * salary_hour * 1.5   
	                    + super.getSalary(month));  
	        }  
	        else  
	        {  
	            return salary_hour * hour + super.getSalary(month);  
	        } 
		
	}
	
}

SalesEmployee类:

public class SalesEmployee extends ColaEmployee{

	public double sale_month;
	public double percent;
	
	@Override  
    public double getSalary(int month)  
    {  
        return sale_month * percent + super.getSalary(month);  
    }
	
}

Company类:

import java.util.Scanner;

public class Company {

	public void output_money(ColaEmployee coe[],int Month){
		
		for(int i=0;i<coe.length;i++){
			
			double gs=coe[i].getSalary(Month);
			System.out.println(Month+"月"+coe[i].name+"的工资是"+gs);
		}
		
	}
	
}

TestCompany类:

import java.util.Scanner;

public class TestCompany {
	
	public  static void main(String[] args){
		
		Company c=new Company();
		Scanner i=new Scanner(System.in);
		System.out.print("请输入要查询的月份:");
		int m=i.nextInt();
		SalariedEmployee ade=new SalariedEmployee();
		SalesEmployee se=new SalesEmployee();
		HourlyEmployee he=new HourlyEmployee();
		ColaEmployee[] ce=new ColaEmployee[]{ade,se,he};
		ade.birth=1;
		ade.name="张三";
		ade.salary_month=2000;
		se.sale_month=1000;
		se.birth=2;
		se.name="李四";
		se.percent=0.5;
		he.birth=3;
		he.name="王五";
		he.hour=200;
		he.salary_hour=10;
		c.output_money(ce, m);
		i.close();
	}
	
}