接口 (Interface)

  • 定义:使用 interface 关键字定义。
  • 实例化:接口不能被直接实例化。
  • 实现:一个类可以实现多个接口。
  • 方法:Java 8 之前,接口中只能包含抽象方法(默认为 public abstract)。Java 8 之后,接口可以包含默认方法(default)和静态方法(static),并且这些方法需要有方法体。
  • 成员变量:接口中只能有常量,即 public static final 变量,并且需要初始化。
  • 设计思想:主要用于定义行为规范,强调“做什么”。

抽象类 (Abstract Class)

  • 定义:使用 abstract 关键字定义。
  • 实例化:抽象类不能被直接实例化。
  • 继承:一个类只能继承一个抽象类。
  • 方法:抽象类可以包含抽象方法和非抽象方法。非抽象方法需要有方法体。
  • 成员变量:抽象类可以有实例变量和静态变量,包括私有变量。
  • 设计思想:用于表示一种类的继承关系,强调“是什么”,包含共享的代码和通用的行为。

关键区别

  • 继承与实现:   - 抽象类:使用 extends 继承。   - 接口:使用 implements 实现。
  • 多继承:   - 抽象类:一个类只能继承一个抽象类。   - 接口:一个类可以实现多个接口。
  • 方法实现:   - 抽象类:可以包含抽象方法和具体方法。   - 接口:Java 8 之前只能包含抽象方法,Java 8 之后可以包含默认方法和静态方法。
  • 成员变量:   - 抽象类:可以有各种类型的成员变量,包括私有变量。   - 接口:只能有 public static final 常量,并且需要初始化。
  • 设计思想:   - 抽象类:强调“是什么”,包含共享的代码和通用的行为。   - 接口:强调“做什么”,定义行为规范。

总结

  • 接口:主要用于定义行为规范,允许一个类实现多个接口,增强代码的灵活性。
  • 抽象类:主要用于表示类的继承关系,提供共享的代码和通用的行为,强调“是什么”。

这两种设计模式各有优势,选择使用哪种取决于具体的业务需求和设计目标。