抽象类和接口的对比

抽象类和接口的对比

  1. 相关概念

    • 抽象方法:一种不完整的方法,仅有声明没有方法体。声明抽象方法的语法:abstract void f();
    • 抽象类:包含抽象方法的类。如果一个类包含一个或多个抽象方法,该类必须限定为抽象的(否则编译器报错)。抽象类中可以有普通方法,即有方法体
    • 接口:interface关键字产生一个完全抽象的类,没有任何方法体接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法。
  2. 抽象类是用来捕捉子类的通用特性的,实现代码重用

    接口是抽象方法的集合,利用接口可以达到 API 定义和实现分离的目的,提供程序的扩展性和可维护性。

    从设计层面来说,抽象类是对类的抽象,是一种模板设计;接口是行为的抽象,是一种行为的规范。

    相同点

    • 接口和抽象类都不能实例化
    • 都位于继承的顶端,用于被其他类实现或继承
    • 都包含抽象方法,其子类都必须重写这些抽象方法

    不同点

    参数 抽象类 接口
    声明 抽象类使用abstract关键字声明 接口使用interface关键字声明
    实现 子类使用extends关键字来继承抽象类。如果一个类继承了抽象类,那么该子类必须实现抽象类的所有抽象方法。 子类使用implements关键字来实现接口。如果一个类实现了接口,那么该子类必须实现父接口的所有方法。
    构造器 抽象类可以有构造器 接口不能有构造器
    访问修饰符 抽象类中的方法可以是任意访问修饰符 接口方法默认修饰符是public。并且不允许定义为 private 或者 protected
    字段声明 抽象类的字段声明可以是任意 接口的字段默认都是 static 和 final
    多继承 一个类最多只能继承一个抽象类 一个类可以实现多个接口

    备注

    • Java8接口中引入默认方法和静态方法,以此来减少抽象类和接口之间的差异。现在,我们可以为接口提供默认实现的方法了,并且不用强制子类来实现它

    • 接口和抽象类各有优缺点,在接口和抽象类的选择上,必须遵守下面的几个原则:

      • 抽象类用来定义某个领域的固有属性,即抽象类表示它是什么;接口用来定义某个领域的扩展功能,即接口表示它能做什么
      • 当需要为子类提供公共的实现代码时,应优先考虑抽象类。因为抽象类中的非抽象方法可以被子类继承,使实现功能的代码更简洁
      • 当注重代码的扩展性和可维护性时,应当优先采用接口。①接口与实现类之间可以不存在任何层次关系,接口可以实现毫不相关类的行为,比抽象类的使用更加方便灵活;②接口只关心对象之间的交互方法,而不关心对象所对应的具体类。接口是程序之间的一个协议,比抽象类的使用更安全、清晰。一般使用接口的情况更多。
posted @ 2022-06-05 21:02  大于昨天  阅读(71)  评论(0编辑  收藏  举报