面向对象(一):三大特征和五大特性

1,120 阅读5分钟

面向对象(一)

这是我参与新手入门的第3篇文章

面向对象是java基础里面的重点,这里我将多分几篇去总结。

面向对象概述

面向对象编程(OOP)Object Oriented Programming,面向对象是一种思想,经常听到的一句话就是:万事万物皆对象

​ 该如何去理解呢?其实这就是一个归纳、整理和抽象的过程。比如生活中的桌椅板凳、汽车飞机、包子面条等等,我们对某一类事务的归类和定义称为,而类中具体的一个事务,如一张具体电脑桌、一辆五菱宏光、一个叉烧包和一碗牛肉面这些都是具体的对象定义了某一类对象的属性功能类是抽象,对象是具体。举个栗子:桌子是类,这个类中包含长、宽、高、颜色、材质、形状等等属性,还有放物体功能。电脑桌是一个具体的对象,这些属性都有具体的数值,实现了放电脑这个功能。

3.对象-桌子.jpg

3.对象-电脑桌.jpg

​ 在编程时我们先将需要实现的功能抽象成一个个类,里面定义我们需要的数据和方法,然后通过创建对象去实现具体的方法。

三大特性

  1. 封装:将客观事物抽象为逻辑实体,实体的属性和功能相结合,形成一个有机的整体。并对实体的属性和功能实现进行访问控制,向信任的实体开放,对不信任的实体隐藏。通过开放的外部接口即可访问,无需知道功能如何实现。

    封装主要有以下目的:

    • 可隐藏实体实现的细节。
    • 提高安全性,设定访问控制,只允许具有特定权限的使用者调用。
    • 简化编程,调用方无需知道功能是怎么实现的,即可调用。
  2. 继承:在继承机制下形成有层级的类,使得低层级的类可以延用高层级类的特征和方法。继承的实现方式有两种:实现继承、接口继承。

    实现继承:直接使用基类公开的属性和方法,无需额外编码。

    接口继承:仅使用接口公开的属性和方法名称,需要子类实现。

    继承有以下目的:

    • 复用代码,减少类的冗余代码,减少开发工作量。
    • 使得类与类之间产生关系,为多态的实现打下基础。

    继承的时候涉及到两个概念 方法重载 方法重写

    • 方法重载:在同一个类中处理不同数据的多个相同方法名的多态手段。(函数名一样,类型参数不一样)
    • 方法重写:相对继承而言,子类中对父类已经存在的方法进行区别化的修改。
  3. 多态:是指一个类的同名方法,在不同情况下的实现细节不同。多态机制实现不同的内部实现结构共用同一个外部接口。

    多态有以下目的:

    • 一个外部接口可被多个同类使用。
    • 不同对象调用同个方法,可有不同实现。

五大基本原则

  1. 单一职责 Single Responsibility Principle

    • 定义:一个对象应该只包含单一的职责。并将该职责完整的封装到一个类中。
    • 另一种定义:就一个类而言,应该仅有一个引起它变化的原因。
    • 关键:单一职责,高内聚,低耦合
    • 目的:高内聚,低耦合
    • 其核心思想为:一个类,最好只做一件事,只有一个引起它的变化。
  2. 开闭原则 Open Close Principle

    • 定义:一个软件实体应当对扩展开放,对修改关闭
    • 关键:通过抽象封装可变元素
    • 目的:在不修改源代码的情况下改变模块的行为
    • 其核心思想是:软件实体应该是可扩展的,而不可修改的。
    • 实现开开放封闭原则的核心思想就是对抽象编程,而不对具体编程,因为抽象相对稳定。
  3. 里氏替换原则 Liskov Substitution Principle

    • 定义:所有引用基类的地方都能透明的使用其子类。是实现开闭原则的重要方式之一
    • 目的:在程序中尽量使用积累类型来对对象进行定义,而在运行时在确定其子类类型
    • 其核心思想是:子类必须能够替换其基类。
    • 实现的方法是面向接口编程:将公共部分抽象为基类接口或抽象类,通过Extract Abstract Class,在子类中通过覆写父类的方法实现新的方式支持同样的职责。
  4. 依赖倒转原则 Dependence Inversion Principle

    • 定义:高层模块不应该依赖底层模块,都应该依赖抽象,细节依赖于抽象,抽象不依赖于细节
    • 常用实现方式:在代码中使用抽象类,而将具体类放在配置文件中
    • 其核心思想是:依赖于抽象。具体而言就是高层模块不依赖于底层模块,二者都同依赖于抽象;抽象不依赖于具体,具体依赖于抽象。
  5. 接口隔离原则 Interface segregation Principle

    • 定义:客户端不应该依赖那些它不需要的接口interface(这里的接口指的是所定义的方法)。

    • 另一种定义:一旦一个接口太大,则需要将它分割成一些更细小的接口,使用该接口的客户端仅需要知道与之相关的方法即可。

    • 其核心思想是:使用多个小的专门的接口,而不要使用一个大的总接口。

    • 分离的手段主要有以下两种:1、委托分离,通过增加一个新的类型来委托客户的请求,隔离客户和接口的直接依赖,但是会增加系统的开销。2、多重继承分离,通过接口多继承来实现客户的需求,这种方式是较好的。