5、抽象类
5.1概念
我们把一个不是具体的功能称作抽象的功能,而一个类中有抽象的功能,则该类必须是抽象类
5.2关键字:abstrac
5.3注意
- 抽象类可以没有抽象方法
- 抽象方法没有方法体
public abstract void eat(){};这不叫没有方法体,这叫空方法体,去掉大括号才叫没有方法体 - 抽象类不能实例化(就是不能创造对象),因为它不是具体的
- 若想抽象类的子类不是抽象类,就要重写所有的抽象方法,这样子类不是抽象类,就可以去创建对象
- 以后提到抽象类的实例化,就得想到多态
例如Animal a= new Cat();其中Animal是抽象类 Cat()是具体子类,则这句话不会报错
但其实我写成Cat c= new Cat();一样可以使用各种功能,感觉比上面的那句好用,但是我又发现,这样好像不能调用父类的构造方法对其数据进行初始化
5.4抽象类的成员特点
- 成员变量
可以是常量,也可以是非常量 - 构造方法
有,用于子类访问父类数据的初始化 - 成员方法
可以是抽象的,也可以是非抽象的
5.5抽象类中的成员方法特性
- 抽象方法
强制要求子类做的事情 - 非抽象方法
子类继承的事情,提高代码的复用性
5.6理解
就是每个子类的具体动作不同,我就在父类中定义为抽象的。例如吃是一个抽象动作
此处有一个例子,可以深入对多态的理解见AbstractDemo
5.7补充
- 一个类没有抽象方法,却设置为抽象类的意义:不让你创建这个类的对象,想用就得用它的子类
- abstract关键字不能和哪些关键字共存
private
抽象方法就是为了让子类重写它,而标注了private没法对其重写
final
final标记的不能被重写
static
无意义,因为静态方法可以类名调用,而抽象方法没方法体,所以二者矛盾但不报错,只是没意义