1. 接口
      1. 没有构造方法,也没有实例方法,不能实例化
      2. 无法直接调用,只能通过实现类的对象来调用
      3. 所有变量必须是常量,任何field都隐含着 public static final
      4. 必须有默认方法,JDK8之后才可以有静态方法、抽象方法
      5. 接口可以多实现(一个类可以实现多个接口)
    2. 抽象类
      1. 有构造方法
      2. 用abstract关键字修饰的类,不能实例化。只能通过子类的对象来调用
      3. 可以没有、一个或多个抽象方法;可以有非抽象方法
      4. 抽取共同的方法实现、共同的成员变量,通过继承的方式实现代码的复用
      5. 抽象类只能单继承(一个类只能继承一个抽象类)
    3. 典型应用场景
      1. Java有不允许多继承的局限,而接口在有支持多实现的优势
      2. 为接口添加新的方法,对应的实现类也必须重写该方法;而抽象类可以直接继承该方法,不必重写。但是JDK8之后的默认方法弥补了该缺陷,实现类继承默认方法并不用重写
      3. Java 8 支持函数式编程。增加了 functional interface,即只有一个抽象方法的接口(Runnable,Callable都是函数式接口)
      4. 能够看出不利于后期维护的设计问题
    4. 面向对象的基本要素
      1. 封装 Encapsulation
        1. 隐藏内部实现细节,简化编程
        2. 避免在多线程环境中暴露内部状态,导致并发修改问题
      2. 继承 Inheritance

    一种紧耦合关系,父类代码修改,子类行为也会改变;避免滥用继承

    1. 多态 Polymorphism
      1. 重写(父类子类中相同名字和参数的方法)
      2. 重载(相同名字、不同参数的方法)

    方法名和参数列表一致,但是返回值不同,不叫重载

    1. 3. 向上转型 Upcasting
    2. 1. 子类对象转为父类对象:`Base base = new Child();`
    3. 1. 动态绑定:向上转型后,父类引用不能在调用子类拓展的方法(子类有而父类没有的方法)
    4. 1. 目的是以父类作为参数可以减少重复代码,避免为每个子类各写方法的情况
    5. 4. 向下转型 Donwcasting
    6. 1. 父类对象转为子类对象:`Child c = (Child)base;`
    7. 1. 目的是为了使用子类中拓展的方法
    8. 1. 为了安全可以用`child instanceof Child`来进行判断
    1. SOLID 设计原则(保证程序适当的耦合度
      1. 单一职责(Single Responsibility)分摊责任,一个类负责一个功能
      2. 开关原则(Open-Close, Open for extension, Close for modification)避免因为新增同类功能而修改已有实现(对扩展开放,对修改关闭)
      3. 里氏替换(Liskov Substitution)进行继承关系抽象时,凡是可以用父类或者基类的地方,都可以用子类替换。
      4. 接口分离(Interface Segregation)将接口拆分成功能单一的多个接口,进行解耦。避免在一个接口中定义繁多的方法,后期维护如果接口设计有变,避免对其它接口的实现类造成影响
      5. 依赖反转(Dependency Inversion)高层次模块不应该依赖于低层次模块,而是应该基于抽象
    2. 其他
      1. 接口可以有三种成员
        1. 常量字段
        2. 静态、抽象、默认方法
        3. 静态类型作为嵌套接口和类
      2. Java中的字段,即filed,通常指承载数据的成员变量
      3. Java中的属性,即property,通常指getter-setter方法名去掉”set”/“get”后,将剩余部分首字母小写得到的字符串