抽象类
为什么会有多态?
为什么会有java?
c++
缺点: 不能跨平台、严重依赖硬件
子类能不能重写父类的抽象方法
抽象方法就是让重写的
抽象方法有什么用
写程序:架构师 程序员
架构师:搭框架,写抽象方法
程序员:写实现类,重写抽象方法 写增删改查的代码
普通方法和抽象方法的区别
普通方法必须要有方法体,抽象方法没有方法体
- 抽象方法要用abstract 修饰
- 抽象方法必须在抽象类中
- 普通类和抽象类区别
普通类和抽象类的区别
- 抽象类不能实例化,普通类何以实例化
- 抽象类要用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);
}
}
代码复用:可以降低代码冗余,
判断代码的好坏标准
- 没有明显的bug
- 看功能
- 健壮性
- 可维护性
- 可升级
- 效率
- 等等
抽象类的优势:
- 抽象类可以将已经实现的方法体提供给子类使用,使代码被复用
- 凑想类中的抽象方法在子类中重写,保证了子类还具有自身独特的特性
- 通过抽象类指向其子类的对象,可以实现多态
接口
接口是什么?
接口是一种约定或者是一种规范
约定:两种工程师(,架构师,程序员)
架构师:搭框架,根据要求,搭建好项目后,把接口预留,就可以撤了
程序员:上场,根据要求(约定),写接口的实现类,写具体的增删改查代码就可以了
最终项目就会正常完工。
语法:interface
接口中只定义方法,不能写方法的具体实现
接口中的所有方法都是默认方法,所以不用写abstract
接口中绝对不会有具体方法
接口就是让实现的,抽象方法就是让重写的
一个类,如果实现一个接口,那么就必须重写接口的所有方法。
实现接口:implements
一个类可以实现多个接口
单继承,多实现:一个类只能有一个父类,但是可以有多个接口
抽象类和接口的方法
- 抽象类使用abstract声明,接口使用implements声明
- 抽象类可以包含抽象方法(必须写abstract)和普通方法,接口只包含抽象方法(无须使用abstract 关键字)
使用抽象类代码有缺陷,可能会出现冗余,
冗余:代码不能删除,但是跟其它地方的代码重复
多余:代码直接删除不会对项目造成影响
步骤:
- 定义一个接口,接口里定义一个方法
- 把这个具体的怎么叫,剥离出来,定义各种叫的类,实现接口
- 把ShoutAbility 作为属性方法Bird类中
- 修改Bird的cry()方法
- 删除Bird子类的cry()方法
知识点补充:一个类可以作为另一个类的属性。