在 Java 中,接口、抽象类和普通类都是不同的概念,各自有其特定的用途和特性。了解它们之间的区别和联系有助于更好地利用 Java 的面向对象编程特性。

接口(Interface)

  1. 定义:

    • 接口是一种完全抽象的类,它允许声明方法但不允许实现它们(直到 Java 8 引入默认方法之前)。
  2. 用途:

    • 用于定义一个合同或协议,类可以实现一个或多个接口,从而承诺提供接口中定义的行为。
  3. 特性:

    • 从 Java 8 开始,接口可以包含默认方法和静态方法。
    • 只能有静态和非静态抽象方法。
    • 成员变量默认是 public static final。

抽象类(Abstract Class)

  1. 定义:

    • 抽象类是不能实例化的类,它可以包含抽象方法(没有具体实现的方法)和具体方法。
  2. 用途:

    • 用于提供一个基础类,其中包含一些共享的代码和/或仅提供方法声明的抽象方法。
  3. 特性:

    • 可以有构造函数、字段、方法(包括具体方法和抽象方法)。
    • 可以有访问修饰符,用于控制子类的继承。
    • 子类必须实现所有抽象方法,除非子类也是抽象类。

普通类(Class)

  1. 定义:

    • 普通类是可以实例化的类,它定义了对象的结构和行为。
  2. 用途:

    • 用于创建具体的对象实例,实现具体的业务逻辑。
  3. 特性:

    • 可以包含字段、方法、构造函数等。
    • 可以继承其他类(单继承)并实现多个接口。

区别和联系

  • 共同点:

    • 接口和抽象类都不能被实例化。
    • 它们都可以包含抽象方法,用于指定子类必须实现的行为。
  • 不同点:

    • 抽象类可以包含具体的方法和字段,而接口只能包含抽象方法(直到 Java 8 引入默认方法和静态方法)。
    • 类可以实现多个接口,但只能继承一个抽象类。
    • 接口成员默认是 public,而抽象类成员可以有不同的访问级别。
  • 使用场景:

    • 如果你想定义一个不允许实例化的基础类并提供一些共享代码,使用抽象类。
    • 如果你想定义一个合同或协议,让多个类可以实现但不提供共享代码,使用接口。

简而言之,接口和抽象类在 Java 中都用于定义不能直接实例化的类型,并允许其他类继承或实现它们,从而共享或承诺特定的行为。普通类则是可以直接实例化的具体实现,提供了具体的业务逻辑和数据结构。

11-22 11:50