目录
通过问题引出
介绍
关键点
细节
编辑
抽象类的最佳设计模式--模版设计模式
1.先用最容易想到的方法
2.分析问题,提出使用模板设计模式
通过问题引出
假如我们有个动物类, 动物都有eat吃的方法, 但是具体吃什么, 我们不知道, 因为是什么动物我们不知道, 那么我们就可以声明为抽象类
>>>当父类的某些方法,需要声明,但是又不确定如何实现时,可以将其声明为抽象方法,那么这个类就是抽象类
介绍
所谓抽象方法就是没有实现的方法
所谓没有实现就是指, 没有方法体
当一个类中存在抽象方法是, 这个类也必须声明为抽象类
一般来说, 抽象类会被继承, 有子类来具体实现
关键点
1) 用abstract关键字来修饰一个类时,这个类就叫抽象类
访问修饰符 abstract 类名{
}
2) 用abstract关键字来修饰一个方法时,这个方法就是抽象方法
访问修饰符 abstract 返回类型 方法名(参数列表);
//没有方法体
3)抽象类的价值更多作用是在于设计,是设计者设计好后,让子类继承并实现它
4)抽象类,是考官比较爰问的知识点, 在框架和设计模式使用较多
细节
1)抽象类不能被实例化
2)抽象类不一定要包含abstract方法。也就是说, 抽象类可以没有abstract方法
3)一旦类包含了abstract方法,则这个类必须声明为abstract
4) abstract 只能修饰类和方法,不能修饰属性和其它的
5) 抽象类可以有任意成员[因为抽象类还是类],比如:非抽象方法、构造器、静态属性等等
6) 抽象方法不能有主体,即不能实现
7) 如果一个类继承了抽象类,则它必须实现抽象类的所有抽象方法,除非它自己也声明为 abstract类
8) 抽象方法不能使用private、 final 和 static来修饰,因为这些关键字都是和重写相违背的
抽象类的最佳设计模式--模版设计模式
如果有一个需求
1)有多个类,完成不同的任务job
2) 要求统计得到各自完成任务的时间
1.先用最容易想到的方法
A类如下方法:
B类有如下方法:
然后我们去执行:
但是这样有一个问题如果每个类的还有多个job需要去计算, 这样代码的复用率极低
我们可能会说可以把重复的代码抽出来单独写一个如下的方法, 实现代码的复用
这样也有一个问题就是这样每个类都需要写一个这样的方法
2.分析问题,提出使用模板设计模式
所以我们就需要抽象类和抽象方法, 将每个类要写的这个方法抽离为一个模版
AA类去重写
BB类也去重写
打印效果相同
aa.calulateTime的调用过程就是, 它先到AA类里面去看有没有这个方法, 没有之后找到父类的这个方法, 父类去掉用job, 此时上面的job是抽象方法, 这个抽象方法通过动态绑定机制, 绑定到当前对象, 在去调用AA 类里面的job方法