抽象类
目的:子类继承某些父类的时候,对其有一些明确的方法覆写的要求。
基本定义
关键字:abstract
抽象类及其中的抽象方法,都需要使用abstract进行定义
抽象类并不是一个功能完整的类,使用时须遵循以下原则:
- 必须提供子类,子类使用extends继承抽象类
- 子类(可以不是抽象类)覆写抽象类全部抽象方法
- 抽象类对象实例化可以利用对象多态性,通过子类对象向上转型完成
抽象类不直接进行对象实例化:
抽象方法“徒有空壳”,并没有方法体,所以实例化之后的对象调用没有方法体的方法,实现不了任何功能;所以需要通过子类将方法覆写,子类实例化对象调用覆写后的方法体。
注意事项
- 抽象类必须被子类继承,所以它与final“水火不容”
- 抽象类中可以没有任何抽象方法,只有普通方法也OK,但是无论如何,抽象类不能直接进行对象实例化
- 抽象类允许提供普通方法或者构造方法,所以子类默认会调用父类的无参构造,或者通过super()指定调用父类某种构造方法
- static方法不会受到抽象类的影响,仍然可以通过类名直接调用
模板设计模式
代码在P.189页
通过Action抽象类定义了三个抽象方法“Read(), paint(), run()”,分别需要子类“Book(), Sketchpad(), Car()”来实现其中的1~2个方法
注:由于抽象方法需要子类全部继承覆写,但是三个子类并不需要3个功能,比如Book()不需要run(),所以中间设置了适配器类ActionAdapter()作为Action的子类继承三个方法并覆写为普通方法,我们实际需要的三个子类作为ActionAdapter的子类,这样子就可以实现在三个方法中有选择的继承。
一点思考:之所以绕了一圈,不直接把抽象类里的方法设置为普通方法,应该是为了保持抽象类的优势,其定义的所有抽象方法强制被继承的子类覆写(实现)。
举个不是很恰当的栗子:
不妨把抽象类想象成老师,他认为学生什么都会,于是布置给计算机方向,语言方向,数学方向的同学三个题目:
“写一个1000行的代码实现某个操作,写一个1000字的英文paper简述设计思路,通过数学语言将设计思路抽象成符号。”
实际情况是,大家啥也不会(bushi),大家需要分工合作,每人完成一个板块的任务,于是助教老师出现了(就是我们可爱的适配器)。她说,大家把这个作业当成小组作业,八仙过海,各显神通叭~
于是,大家happy happy地解决了这个作业。