PART1:抽象类
A:抽象类介绍
使用"abstract"关键字声明的类叫做抽象类。抽象类的作用是:
从多个具有相同特征的子类抽取出相同的特征建立一个抽象类,以这个抽象类作为子类的模板,从而避免了子类设计的随意性。
举个栗子:
狗是动物,猫也是动物,狗和猫都会吃、喝、睡。现有如下需求:
- 创建一个狗对象
- 创建一个猫对象
分析:狗和猫都会吃、喝、睡。这是它们的共同点,同时它们还都是动物。突然想到,好像动物都会吃喝睡。所以可以定义一个Animal类,类中定义吃、喝、睡三个方法。Dog类和Cat类分别继承Animal类,然后在自己的类中个性化修改吃、喝、睡方法,这样就不用写那么多代码啦。即便以后来了头牛,不怕,直接让它继承Animal类就好咯。
B:抽象类特点
-
抽象类和抽象方法必须用 abstract 关键字修饰;
abstract class Student{ // 抽象类 public abstract void eat(); // 抽象方法 }
-
抽象类里可以没有抽象方法,有抽象方法的类一定是抽象类或者接口;
-
抽象类不能实例化,只能由具体的子类实例化。这属于多态的一种;
-
对于抽象类的子类:
- 要么也是抽象类;
- 要么重写所有的抽象方法。
C:抽象类的成员特点
- 抽象类的成员变量:
- 既可以是变量,也可以是常量。abstract 不能修饰成员变量。
- 抽象类的成员方法:
- 既可以是抽象的,也可以是非抽象的。
- 抽象类成员方法分类:
- 抽象方法:强制要求子类要重写父类中的抽象方法;
- 非抽象方法:子类不需要重写直接继承的事情,提高代码的复用性。
- 抽象类可以有构造方法,用于子类访问父类数据的初始化。
PART2:接口
A:接口的介绍
从狭义的角度讲就是指java中的"interface",从广义的角度讲就是对外提供规则的都是接口。接口的作用是:
接口中定义多个类的共同的行为规范,这些行为是与外部交流的通道,这就意味着接口里通常定义的是一组公用方法。
举个栗子:
Animal类中定义了吃、喝、睡三种方法,Dog类和Cat类继承Animal类。现有如下需求:
- 创建两个对象,一个是普通狗,一个是哮天犬,普通狗会吃喝睡,哮天犬除了吃喝睡之外还会打架。
- 再有两个对象,一个是普通猫,一个是虹猫,普通猫会吃喝睡,虹猫除了吃喝睡也会打架。
分析:对于普通狗和普通猫好说,父类Animal中已经定义了吃喝睡的方法,普通狗、猫对象对父类中的吃喝睡方法进行针对性重写即可。但是对于打架这个方法呢?可不可以再定义两个类DogSon、CatSon分别继承Dog类、Cat类,然后分别在两个类中写打架的方法?当然可以。但是,这里有一种更好的方法:将打架这个方法声明在接口中,定义两个类DogSon、CatSon分别继承Dog类、Cat类,然后让DogSon、CatSon分别实现这个接口。
B:接口的特点
-
接口用关键字 interface 表示:
interface Inter{} //定义接口Inter
-
类实现接口用 implements 表示:
class Student implements Inter{} // 类Student实现接口Inter
-
接口的子类:
- 可以是抽象类,但是意义不大;
- 可以是具体类,需要重写接口中所有的抽象方法。(推荐)
-
接口不能实例化:只可按照多态的方式实例化。
C:接口的成员特点
- 成员变量:只能是常量,并且必须是静态的、公共的。
- 默认修饰符:public static final
- 建议手动给出
- 成员方法:只能是抽象方法。
- 默认修饰符:public abstract
- 建议手动给出
- 构造方法:接口没有构造方法。
PART3:抽象类和接口的总结
A:类与类的关系、类与接口的关系,接口与接口的关系
- 类与类的关系:
- 继承关系,只能是单继承,但是可以多层继承。
- 类与接口的关系:
-
实现关系,可以单实现,也可以多实现。并且还可以在继承一个类的同时实现多个接口。
class Student implements InterA,InterB{} // 类Student实现接口InterA和接口InterB
-
- 接口与接口的关系:
- 继承关系,可以单继承,也可以多继承。
B:抽象类和接口的对比
- 相同点
- 接口和抽象类都不能被实例化(位于继承树的顶端);
- 接口和抽象类都可以包含抽象方法(实现接口或者继承抽象类的普通子类都必须实现这些抽象方法)。
- 不同点
- 用法区别:
- 抽象类:
- 一个类最多有一个直接父类
- 成员方法:可以是抽象,也可以是非抽象;
- 成员变量:既可以是变量,也可以是常量;
- 构造方法:有。
- 接口:
- 一个方法可以实现多个接口
- 成员变量:只可以是静态常量;
- 成员方法:只可以是抽象方法;
- 构造方法:无。
- 抽象类:
- 设计理念区别
- 抽象类:
- 被继承体现的是"is a"的关系,抽象类中定义的是该继承体系的共性功能。
- 它所体现的是一种模板式设计。
- 抽象类作为多个子类的父类,可以被当成系统实现过程中已经实现了部分功能的中间产品,但是这个产品还不能作为最终的产品,还需要进一步的完善。
- 接口:
- 被实现体现的是"like a"的关系,接口中定义的是该继承体系的扩展功能。(可以理解为特性功能)
- 接口作为系统与外界交互的窗口,体现的是一种规范。
- 接口类似于整个系统的"规则",系统各模块都要遵循接口的标准,因此接口若发生改变,将辐射到整个系统,大部分类都要重写。(不推荐经常改变接口)
- 抽象类:
- 用法区别: