面向对象之抽象和接口

来源:互联网 发布:js鼠标经过特效 编辑:程序博客网 时间:2024/05/17 11:56

@(笔记)[面向对象|MarkDown|我的博客]
07.14

面向对象之抽象和接口

抽象类(掌握)

把多个类中相同的方法声明给抽取出来。定义到一个类中。

  • 一个方法如果只有方法声明,没有方法体,那么该方法必须定义为抽象方法。
  • 而一个类中如果有抽象方法,那么,该类必须定义为抽象类。

抽象类的特点:

  • 抽象方法和抽象类都必须用abstract表示。
  • 一个类继承抽象类的时候;
    • 要么:本身是一个抽象类。
    • 要么:实现抽象类中的所有抽象方法。
  • 抽象类有构造方法,但是不能实例化,可以按照多态的使用方式使用。
  • 成员特点:
    • 成员变量
      • 可以是变量,也可以是常量。
  • 构造方法
    • 有 用于子类访问父类构造方法,初始化父类数据
  • 成员方法
    • 可以是抽象,也可以非抽象。
  • 抽象类的好处:

    • 抽象类中的非抽象方法提高了代码的复用性。
    • 抽象类中的抽象方法强制要求子类必须重写某些方法。
  • 抽象类中的几个小问题:

    • 抽象类不能实例化,构造方法有什么用呢?
      • 用于子类访问父类数据的初始化。
    • 如果一个类中没有抽象方法,而类却被定义为了抽象类,请问为什么?
      • 不让创建对象。
    • abstract不能和哪些关键字共存:
      • private: 冲突
      • final: 冲突
      • static: 无意义

接口(掌握)

如果一个抽象类中的所有成员方法都是抽象的,java就提高了一种更抽象的表达方式:接口。

接口的特点:

  • 接口用interface定义。
    类实现接口用implements关键字。
  • 一个类要实现接口:
    • 本身是抽象类。
    • 实现接口中的所有抽象方法。
  • 接口不能实例化。可以按照多态的使用方式使用。
  • 成员特点:
    • 成员变量:只能是常量。
      • 默认修饰符:public static final
      • 成员方法:只能是抽象方法。
      • 默认修饰符:public abstract

使用接口的原则

  1. 使用接口解决多继承
  2. 使用接口为外部类添加功能
  3. 以面向对象的角度考虑,将一个类与生俱来的特征和行为和依赖于外部的可选的特征和行为分离,让类尽可能的单纯,即解耦

接口的优点

  1. 将设计和实现分离,对外(调用者)隐藏了实现(而通常调用者也不需要关心实现)
  2. 面向接口编程是OOP的核心

类与接口的关系:

  • 类与类的关系
    • 继承: 单继承。
  • 类与接口的关系
    • 实现: 单实现,多实现。
    • 继承一个类的同时实现多个接口。
  • 接口与接口的关系
    • 继承: 单继承,多继承。

抽象类和接口的区别:

  • 成员区别
    • 抽象类:
      • 成员变量
        • 可以是变量,也可以是常量。
      • 构造方法
      • 成员方法
        • 可以是抽象,也可以非抽象。
    • 接口:
      • 成员变量:只能是常量。
        • 默认修饰符:public static final
      • 成员方法:只能是抽象方法。
        • 默认修饰符:public abstract
  • 关系区别
    • 类与类的关系
      • 继承,单继承。
    • 类与接口的关系
      • 实现,单实现,多实现。
      • 继承一个类的同时实现多个接口。
    • 接口与接口的关系
      • 继承,单继承,多继承。
  • 设计理念不同
    • 抽象类被继承体现的是:is a的关系。抽象类中定义的是继承体系共性功能。
    • 接口被实现体现的是:like a的关系。接口中定义的是继承体系的扩展功能。

什么时候把抽象方法写到抽象类中–>与生俱来的行为
什么时候把抽象方法写到接口中 –>附属添加的第三方的行为

总结

  1. 抽象类在java语言中所表示的是一种继承关系,一个子类只能存在一个父类,但是可以存在多个接口。
  2. 在抽象类中可以拥有自己的成员变量和非抽象类方法,但是接口中只能存在静态的不可变的成员数据(不过一般都不在接口中定义成员数据),而且它的所有方法都是抽象的。
  3. 抽象类和接口所反映的设计理念是不同的,抽象类所代表的是“is-a”的关系,而接口所代表的是“like-a”的关系。

抽象类和接口是java语言中两种不同的抽象概念,他们的存在对多态提供了非常好的支持,虽然他们之间存在很大的相似性。但是对于他们的选择往往反应了您对问题域的理解。只有对问题域的本质有良好的理解,才能做出正确、合理的设计。

0 0
原创粉丝点击