- 抽象类
- 声明
- 抽象类无法实例化
- 作用
- 接口
- interface
- implements
- 一类多接口
- 接口继承
- 二者的区别
- 二者的适用场合
- 抽象类适用场合
- 接口的适用场合
把一个方法声明为 abstract ,表示它是一个抽象方法,本身没有实现任何方法语句。因为这个抽象方法本身是无法执行的。把方法声明为抽象方法的目的是让子类去覆写它。
即:如果一个类定义了方法,但没有具体的执行代码,这个方法就是抽象方法。抽象方法用 abstract 修饰。
如果一个类包含了抽象方法,那么这个类也必须被声明为抽象类 (abstract class)。
抽象类无法实例化抽象类中的抽象方法无法被执行,因此抽象类无法实例化。
作用抽象类本身被设计成只能用于被继承,继承了抽象类的子类,必须实现其定义的抽象方法才可以通过编译。因此抽象类实际上相当于定义了一种“规范”。
接口 interface如果一个抽象类没有字段,所有方法都是抽象方法,那么就可以把该抽象类改为接口:interface
在java中,使用 interface 可以声明一个接口。
implements当一个具体的类去实现一个 interface 时,需要使用 implements 关键字。
一类多接口在 java 中,一个类只能继承自另一个类,不能从多个类继承,但是一个类可以实现多个接口。
接口继承一个接口可以继承自另一个接口,使用 extends 关键字。
二者的区别| 抽象类 | 接口 | |
|---|---|---|
| 构造方法 | 可以有构造方法 | 不能有构造方法 |
| 一个类只能继承一个抽象类 | 一个类可以实现多个接口 | |
| 普通成员变量 | 可以有普通成员变量 | 没有普通成员变量 |
| 静态变量 | 可以包含静态变量 | 可以包含静态变量 |
| 静态方法 | 可以包含静态方法 | 不能包含静态方法 |
| 实现方式 | 用implements实现 | 用extends实现 |
| 非抽象方法 | 可以有非抽象方法 | 不能有非抽象方法(通过 default 关键字可以实现默认方法) |
- 当关注一个类的本质时或者说与其父类、子类之间的联系时,使用抽象类。
例如:车类有很多子类,汽车、卡车、自行车。
他们的共同特征是有轮子、可以走,那么轮子就可以在父类中声明。然后在子类中表示出他们的区别。 - 想要约束子类具有共同的特征与行为,又能拥有实例变量时,使用抽象类。
- 当关注一个方法、操作、功能或是行为时,使用 interface。
例如:某个方法(行为)是 fly(),这个行为可以被包含在多个类中(如飞机、鸟)。
但飞机和鸟往往不会被算在同一个父类下。这种情况我们就设置一个接口 Fly{},用鸟、飞机两个类来实现这个接口。 - 当一个类需要实现多个功能,但多个功能之间没有联系时。(例如 Human 类需要实现 sleep 、eat、drink 功能)。
- 约束多个实现类具有统一的行为,但是不在乎每个实现类如何具体实现时,使用接口。
例如:鸟、飞机、蚊子。3者都可以飞,但又不是一类事物,就用接口。



