7.20-抽象类和接口

抽象类

为什么会有多态?

为什么会有java?

c++
缺点: 不能跨平台、严重依赖硬件

子类能不能重写父类的抽象方法
抽象方法就是让重写的

抽象方法有什么用

写程序:架构师 程序员
架构师:搭框架,写抽象方法
程序员:写实现类,重写抽象方法 写增删改查的代码

普通方法和抽象方法的区别

普通方法必须要有方法体,抽象方法没有方法体

  1. 抽象方法要用abstract 修饰
  2. 抽象方法必须在抽象类中
  3. 普通类和抽象类区别

普通类和抽象类的区别

  1. 抽象类不能实例化,普通类何以实例化
  2. 抽象类要用abstract 修饰

抽象类怎么用
如果里面大的方法是抽象的,那么这个类就必须写成抽象类
为什么方法要定义成抽象的?
因为不同的方法对此方法有不同的重写。此方法没有必要写具体实现,所以可以写成抽象的。

例:
普通员工薪水:基本工资+全勤

销售:基本工资+提成

经理:基本工资+提成+绩效

计算每个岗位的工资:

//员工类  父类
public abstract class Employee {
	
	
	//计算薪水的方法
	public abstract void payRoll();
}
//经理
public class Hander extends Employee {

	private double basePay;
	private double ticheng;	//提成
	private double jixiao;	//绩效
	
	
	
	public Hander() {
		super();
	}



	public Hander(double basePay, double ticheng, double jixiao) {
		super();
		this.basePay = basePay;
		this.ticheng = ticheng;
		this.jixiao = jixiao;
	}



	@Override
	public void payRoll() {
		// TODO Auto-generated method stub
		System.out.println("经理工资:基本工资+绩效+提成:"
		+(basePay+ticheng+jixiao));
		
	}

}
//销售
public class Market extends Employee {


	private double basePay;
	private double ticheng; // 提成
	
	
	public Market() {
		super();
	}





	public Market(double basePay, double ticheng) {
		super();
		this.basePay = basePay;
		this.ticheng = ticheng;
	}

//普通员工
public class Starff extends Employee {

	private double basePay;
	private double quanqin;
	
	
	public Starff() {
		super();
	}


	


	public Starff(double basePay, double quanqin) {
		super();
		this.basePay = basePay;
		this.quanqin = quanqin;
	}





	@Override
	public void payRoll() {
		// TODO Auto-generated method stub
		System.out.println("普通员工的工资:"+(basePay+quanqin));

	}

}

//支付类
public class Pay {
	
	// 支付员工工资
	public void pay(Employee employee) {
		employee.payRoll();
	}

}
在这里插入代码片

//测试类
public class TestPay {

public static void main(String[] args) {
	// TODO Auto-generated method stub
	//基本工资
	double basePay = 5000;
	//全勤
	double attendanceBouns = 1000;
	//提成
	double deductionWage = 2000;
	//绩效
	double meritPay = 2000;
	
	Pay pay =new Pay();
	Starff starff =new Starff(basePay,attendanceBouns);
	Hander hander =new Hander(basePay,deductionWage,meritPay);
	Market market = new Market(basePay,deductionWage);
	
	pay.pay(starff);
	pay.pay(market);
	pay.pay(hander);
	

}

}

代码复用:可以降低代码冗余,

判断代码的好坏标准

  1. 没有明显的bug
  2. 看功能
  3. 健壮性
  4. 可维护性
  5. 可升级
  6. 效率
  7. 等等

抽象类的优势:

  1. 抽象类可以将已经实现的方法体提供给子类使用,使代码被复用
  2. 凑想类中的抽象方法在子类中重写,保证了子类还具有自身独特的特性
  3. 通过抽象类指向其子类的对象,可以实现多态

接口

接口是什么?
接口是一种约定或者是一种规范

约定:两种工程师(,架构师,程序员)
架构师:搭框架,根据要求,搭建好项目后,把接口预留,就可以撤了
程序员:上场,根据要求(约定),写接口的实现类,写具体的增删改查代码就可以了
最终项目就会正常完工。

语法:interface

接口中只定义方法,不能写方法的具体实现
接口中的所有方法都是默认方法,所以不用写abstract
接口中绝对不会有具体方法

接口就是让实现的,抽象方法就是让重写的

一个类,如果实现一个接口,那么就必须重写接口的所有方法。

实现接口:implements

一个类可以实现多个接口

单继承,多实现:一个类只能有一个父类,但是可以有多个接口

抽象类和接口的方法

  1. 抽象类使用abstract声明,接口使用implements声明
  2. 抽象类可以包含抽象方法(必须写abstract)和普通方法,接口只包含抽象方法(无须使用abstract 关键字)

使用抽象类代码有缺陷,可能会出现冗余,

冗余:代码不能删除,但是跟其它地方的代码重复
多余:代码直接删除不会对项目造成影响

步骤

  1. 定义一个接口,接口里定义一个方法
  2. 把这个具体的怎么叫,剥离出来,定义各种叫的类,实现接口
  3. 把ShoutAbility 作为属性方法Bird类中
  4. 修改Bird的cry()方法
  5. 删除Bird子类的cry()方法

知识点补充:一个类可以作为另一个类的属性。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值