理解Abstract class和Interface

语法和实践上的区别

  • 抽象类主要是类对象的抽象集合
  • 抽象方法主要是类方法的抽象集合
  Abstract Class Interface
实例化 不能 不能
是一种继承关系,一个类智能使用一次继承关系。
可以通过继承多个接口实现多重继承
一个类可以实现多个接口
数据成员 可以有自己的 必须是默认的static final
方法成员 可以有私有方法,有非abstract方法,如果有abstract方法,
子类必须实现,否则也必须是abstract的 
默认是public abstract类型
设计理念 表示的”is-a”关系 表示是”like-a”关系
集成和抽象 需要继承,要用extends关键字 implements关键字
应用 主要在代码实现方面发挥作用,用于实现代码的重用  主要在架构设计方面发挥作用,主要用于
定义模块间的通信契约
(依赖倒转原则)

    abstract class和interface在使用上最大的区别应当是IS A 和 LIKE A 的区别,继承一个抽象类表示是什么而实现一个接口仅仅表示实现了某个功能即使在他们可以实现对方功能的情形下也应当明确区分其区别(开闭原则),这影响到代码的可维护性和可阅读性。

    另一方面,Java是不支持多继承的,却可以同时实现多个接口,如果我们继承了某个抽象类,就应当表 示子类在本质上属于父类里氏替换原则),而接口的实现仅仅表示可以完成某种功能。也就是说,使用继承描述不会轻易改变的更本质的部分,而使用接口实现更灵活的扩展功能。( 接口隔离原则和合成复用原则)。
 
    需要说明的是,Java 8 增强后的接口可以定义默认方法(使用 default 修饰的方法)和 类方法(使用 static 修饰的方法),接口中的默认方法和类方法都不再是抽象方法,都需要 提供方法体。Java 9 则允许接口中定义 private 方法private 方法可以拥有方法体。