1.抽象方法
仅仅是声明,并不给出定义的方法叫抽象方法。形如 abstract void fun();
2.抽象类
cpp中,包含纯虚函数的类叫抽象类。它没有"抽象"对应的关键字。
如果一个类中有抽象方法,该类必须为抽象类。
如果一个类没中有抽象方法,该类也可以为抽象类。考虑这种情况:有一个类,让其包含任何抽象方法都显得没有实际意义,而且我们也想要阻止产生这个类的任何对象,那么这样做就很有用了。
抽象类不允许实例化。一个类继承一个抽象类,有两种情况:
1.为所有抽象方法写出定义。
2.没有为所有抽象方法写出定义。此时子类也是抽象类,必须加上abstract关键字。
3.与接口的对比
语法对比:
抽象类:不能多继承;既有抽象的方法也有给出实现的方法。
接口:可以多继承;只能声明方法,不能实现方法(java 8中可以给出默认实现)。字段只能是
final static类型。
适用场景对比:
抽象类:一般用作基类。多个子类间既有相同的行为也有不同的行为。相同的行为可在抽象类中作为普通方法实现,不同的行为可在抽象类中定义为抽象方法。
接口:多个类族都能用到的公用方法可以在这里声明。java类库中的
Comparable
,
Cloneable
都是接口。
结合接口与抽象类的各自特征,就有了
默认适配器模式。
4.抽象类中的this
访问字段时找的是抽象类,因为字段不能@Override。
访问方法时分情况讨论,若没有被重写,访问的是抽象类的方法,若被重写,访问的是子类的方法。
所以看下例子:
调试时可以清晰地看到子类继承了抽象类的字段。
图4-1 子类会继承父类的私有字段