java中的抽象(abstract)关键字

abstract关键字

定义

abstract:抽象的

abstract修饰类(抽象类)

  1. abstract修饰类后,此类不能实例化。
  2. 抽象类中一定会有构造器,便于子类实例化调用。
  3. 开发中,都会提供抽象类的子类,让子类对象实例化。

abstract修饰方法(抽象方法)

  1. 抽象方法只有方法的声明,没有方法体。
  2. 包含抽象方法的类,一定是一个抽象类。反之,抽象类中可以没有抽象方法的。
  3. 若子类重写了父类中的所有的抽象方法,此子类方可实例化。若子类没有重写父类中的所有的抽象方法,则此类也是一个抽象类,需要abstract修饰。

abstract类综合举例

编写工资系统,实现不同类型员工(多态)的按月发放工资。如果当月出现某个Employee对象的生日,则将该雇员的工资增加100元。

  • 定义一个Employee类,该类包含:private成员变量name,number,birthday,
  • 其中birthday为MyDate类的对象;abstract方法earnings();
  • toString()方法输出对象的name,number和birthday。
public abstract class Employee {

	private String name;
	private int number;
	private MyDate birthday;
	
	
//	public Employee() {
//		super();
//	}
	public Employee(String name, int number, MyDate birthday) {
		super();
		this.name = name;
		this.number = number;
		this.birthday = birthday;
	}
	//抽象方法
	public abstract double earnings();

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getNumber() {
		return number;
	}
	public void setNumber(int number) {
		this.number = number;
	}
	public MyDate getBirthday() {
		return birthday;
	}
	public void setBirthday(MyDate birthday) {
		this.birthday = birthday;
	}
	@Override
	public String toString() {
		return "name=" + name + ", number=" + number + ", birthday=" + birthday.toDateString();
	}

}
  • MyDate类包含:private成员变量year,month,day;
  • toDateString()方法返回日期对应的字符串:xxxx年xx月xx日
public class MyDate {

	private int year;
	private int month;
	private int day;
	
//	public MyDate() {
//		super();
//	}

	public MyDate(int year, int month, int day) {
		super();
		this.year = year;
		this.month = month;
		this.day = day;
	}

	public String toDateString(){
		return year + "年" + month + "月" + day + "日";
	}

	public int getYear() {
		return year;
	}
	public void setYear(int year) {
		this.year = year;
	}
	public int getMonth() {
		return month;
	}
	public void setMonth(int month) {
		this.month = month;
	}
	public int getDay() {
		return day;
	}
	public void setDay(int day) {
		this.day = day;
	}
}

  • 定义SalariedEmployee类继承Employee类,实现按月计算工资的员工处理。该类包括:private成员变量monthlySalary;
  • 实现父类的抽象方法earnings(),该方法返回monthlySalary值;
  • toString()方法输出员工类型信息及员工的name,number,birthday。
public class SalariedEmployee extends Employee{

	private double monthlySalary;
	
	
//	public SalariedEmployee() {
//		super();
//	}

	public SalariedEmployee(String name, int number, MyDate birthday) {
		super(name, number, birthday);
	}
	
	public SalariedEmployee(String name, int number, MyDate birthday,double monthlySalary) {
		super(name, number, birthday);
		this.monthlySalary = monthlySalary;
	}

	@Override
	public double earnings() {
		
		return monthlySalary;
		
		
	}

	public double getMonthlySalary() {
		return monthlySalary;
	}

	public void setMonthlySalary(double monthlySalary) {
		this.monthlySalary = monthlySalary;
	}

	@Override
	public String toString() {
		return "SalariedEmployee [" + super.toString() + "]";
	}	
}

  • 参照SalariedEmployee类定义HourlyEmployee类,实现按小时计算工资的员工处理。
  • 该类包括:private成员变量wage和hour;
  • 实现父类的抽象方法earnings(),该方法返回wage*hour值;
  • toString()方法输出员工类型信息及员工的name,number,birthday。
public class HourlyEmployee extends Employee{

	private double wage;//每小时的工资
	private double hour;//月工作的小时数
	
	
//	public HourlyEmployee() {
//		super();
//	}

	public HourlyEmployee(String name, int number, MyDate birthday) {
		super(name, number, birthday);
		
	}

	public HourlyEmployee(String name, int number, MyDate birthday, double wage, double hour) {
		super(name, number, birthday);
		this.wage = wage;
		this.hour = hour;
	}

	@Override
	public double earnings() {
		return wage * hour;
	}

//	public HourlyEmployee(double wage, double hour) {
//		//super();
//		this.wage = wage;
//		this.hour = hour;
//	}
	public double getWage() {
		return wage;
	}
	public void setWage(double wage) {
		this.wage = wage;
	}
	public double getHour() {
		return hour;
	}
	public void setHour(double hour) {
		this.hour = hour;
	}

	@Override
	public String toString() {
		return "HourlyEmployee [" + super.toString() + "]";
	}
}

  • 定义PayrollSystem类,创建Employee变量数组并初始化,该数组存放各类雇员对象的引用。
  • 利用循环结构遍历数组元素,输出各个对象的类型,name,number,birthday。
  • 当键盘输入本月月份值时,如果本月是某个Employee对象的生日,还要输出增加工资信息。
public class PayrollSystem {

	public static void main(String[] args) {
		//方式一:
//		Scanner scan = new Scanner(System.in);
//		System.out.println("请输入你的生日月份:");
//		int month = scan.nextInt();
		
		//方式二:常用类Calendar:日历
		Calendar calendar = Calendar.getInstance();
		int month = calendar.get(Calendar.MONTH);//获取当前的月份
		
//		System.out.println(month);//一月份为0
		
		Employee[] emps = new Employee[2];//造了一个数组,长度为2,每个位置声明成Employee类型,这里还没有new对象呢,只是new了一个数组,每个数组元素声明为Employee类型。
		
		emps[0] = new SalariedEmployee("Tom",1002,new MyDate(1992, 2, 28),20000);//这里Employee是抽象类,这里就不要在new Employee(),要new子类。
		emps[1] = new HourlyEmployee("jack", 2001, new MyDate(1991, 5, 6),100,240);
		
	
		for(int i = 0;i < emps.length;i++){
			System.out.println(emps[i].toString());
			double salary = emps[i].earnings();
			System.out.println("月工资为:" + salary);
			
			//month++才是当前月份,因为通过Calendar获取的月份是从0开始计算的
			if(month++ == emps[i].getBirthday().getMonth()){
				System.out.println("生日快乐!奖励1000元");
				salary += 1000;
				System.out.println("月总工资为:" + salary);
			}
		}
	}
}

参考:
https://www.bilibili.com/video/BV1Kb411W75N/?p=350&spm_id_from=pageDriver&vd_source=e3d2dcdad07ba1c727f3c9e7654f60b5

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值