【java核心36讲】接口和抽象类的区别

  • 回答
    • 接口和抽象类是java面向对象设计的两个基础机制。
    • 接口是对行为的抽象,他是抽象方法的集合,利用接口可以达到API定义和实现的分离。接口不能实例化/不能包含非常量成员,任何的feild都是默认public static final的意义;没有非静态方法的实现。
    • 抽象类也是不能实例化的类,用abstract关键字修饰class,其目的主要是代码重用,通常抽取相关的java类的公用方法实现或共同的成员变量,然后通过继承的方式达到代码复用的目的。除了不能实例化,同普通的java类没啥区别,可以有0到多个的抽象方法。
    • 实现interface使用implements
    • 继承abstract类使用extends
    • 接口类增加方法的情况下,其实现类都需要做相应的修改。当然java8引入的default方法除外。
    • 抽象类增加方法,其子类只会享受能力扩展,不用担心编译问题。
  • 扩展
    • java不支持多继承的问题
      • 规范了代码实现的同时,也产生了一些局限性,影响着程序的设计结构。
      • 比如有一些场景需要抽象出与具体实现无关的通用逻辑,或者单纯调用关系的逻辑,使用传统的抽象类会陷入单继承的窘境。成熟的做法是:实现工具类呗。
    • 接口类Marker Interface
      • 没有任何抽象方法的接口。目的就是为了生命某些东西,如Cloneable,Serializable等。
      • 相比Annotation,该形式简单直接。但是Annotation可以有参数和值,更加强大。
    • @FunctionalInterface Annotation
      • 只有一个抽象方法的接口。
    • 面向对象的要素
      • 封装:隐藏事务内部的实现细节,以便提高安全性和简化编程。封装提供了合理的边界,避免外部调用者接触到内部的细节。可能会触发更多的问题,如并发问题。
      • 继承:是代码复用的基础机制。
      • 多态:会立刻想到重写/重载/向上转型。多态是同一个行为具有多个不同表现形式或形态的能力。同一个接口使用不同的实例而执行不同操作。
    • 需要遵守的设计原则
      • 单一职责
      • 开关原则
        • 对扩展开放,对修改关闭。
      • 里氏替换
        • 方式可以用父类或者基类的地方,都可以用子类替换。
      • 接口分离
        • 就是接口的单一职责,这个比普通类的更加重要。
      • 依赖反转
        • 这个我感觉应该就是面向接口的编程吧。实体应该是依赖抽象而不是实现。
原文地址:https://www.cnblogs.com/xxxuwentao/p/10188567.html