接口和抽象类
接口(Interface):
特点:
- 接口只能包含常量(static final字段)和抽象方法(没有方法体的方法)。
- 接口中的所有方法默认为
public
且abstract
,字段默认为public
、static
、final
。 - 一个类可以实现多个接口(多继承),通过
implements
关键字。 - 接口支持多态性,可以使用接口类型引用具体实现类的对象。
用途:
- 定义一组相关的方法,强制实现这些方法的类拥有特定的行为。
- 实现多继承,通过实现多个接口,一个类可以具备多种类型的行为。
- 定义常量,为实现类提供共享的常量。
抽象类(Abstract Class):
特点:
- 抽象类可以包含抽象方法和非抽象方法。
- 抽象方法是没有方法体的方法,需要由子类提供具体实现。
- 抽象类可以包含字段、构造方法,可以有访问修饰符,可以有非抽象方法的实现。
- 一个类只能继承一个抽象类,通过
extends
关键字。
用途:
- 提供一个基类,定义一些通用的行为,但不提供完整的实现。
- 允许在抽象类中定义一些非抽象方法,提供一些通用的实现。
- 通过抽象类实现代码的重用,提高代码的可维护性。
- 可以包含字段,可以有构造方法,可以定义访问控制符。
不同点:
- 多继承: 接口支持多继承,一个类可以实现多个接口;而抽象类只支持单继承,一个类只能继承一个抽象类。
- 构造方法: 接口不能包含构造方法;抽象类可以包含构造方法。
- 字段: 接口只能包含常量字段,而抽象类可以包含各种字段,包括实例字段和静态字段。
- 访问修饰符: 接口中的方法默认为
public
,而抽象类中的方法可以有不同的访问修饰符。 - 方法体: 接口中的方法没有方法体;抽象类中的抽象方法没有方法体,但非抽象方法可以有具体的实现。
选择使用场景:
- 使用接口当你希望提供一组相关的操作,而不关心它们的实现。
- 使用抽象类当你希望提供一组相关的操作,并且要包含一些通用的实现代码。