谈谈对面向对象的理解

写在前面 面试时常被问道:谈谈你对面向对象的理解?面向对象和面向过程有什么区别? 我们该如何回答呢? 什么是面向对象 之前看到知乎上的一个回答,面向对象(Ob

写在前面

面试时常被问道:谈谈你对面向对象的理解?面向对象和面向过程有什么区别?
我们该如何回答呢?

什么是面向对象

之前看到知乎上的一个回答,面向对象(Object Oriented Programming),它的核心是代码的管理而不是代码的实现。简单理解就是,面向对象是把事物抽象为一种类型,这种类型有自己的属性跟方法,把复杂的事情简化为一个个方法和属性,我们不用关心每个方法的代码是怎么实现的,只需要调用即可。万物皆对象,需要解决什么问题,就将什么问题抽象成对象,通过对象的属性和方法来解决问题。

什么是面向过程

面向过程就是把一个大问题分解成若干小问题,再对每个小问题进行分解(分模块),知道每个问题的难度都足以小,能够解决为止,然后再把这些小问题合并,就解决了大问题。而封装的过程其实就是面向过程的编程方式,把完成某种功能按照合适的逻辑顺序编写代码,写出每一步的具体步骤。

面向对象的四大特征

面向对象具有四大特征:抽象、封装、继承、多态。
一些定义摘抄自知乎。

抽象

抽象就是把现实世界中的某一类东西,提取出来,用程序代码表示,抽象出来的一般叫做类或者接口,比如人类,是一种类型的事物,也可以有动物类,植物类。抽象包括两个方面,一个数据抽象,二是过程抽象。数据抽象,表示现实世界中一类事物的特征,就是对象的属性。比如人类有姓名,年龄等(类的属性),过程抽象,表示现实世界中一类事物的行为,就是对象的行为。比如人类可以吃饭,跑步(类的方法)。

封装

封装就是屏蔽细节只暴露实现。人已经有手有脚有嘴,可以直接吃饭跟跑步了,不用关心脚是怎么运动和如何能跑步的,你只需知道有脚就能跑步就行。
封装,意为包装,专业点就是把数据隐藏起来,封装让数据的属性私有化,对数据的访问只能通过调用数据对外开放的方法来操作(get和set方法) 一个对象他所封装的是自己的属性和方法,所以他是不需要依赖其他对象就可以完成自己的操作的。
封装有一下好处:

  1. 良好的封装能够减少耦合
  2. 类内部的结构可以自由修改
  3. 可以对成员进行更精确的控制
  4. 隐藏信息,实现细节

继承

继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承我们能够非常方便地复用以前的代码,能够大大的提高开发的效率。

实际上继承者是被继承者的特殊化,它除了拥有被继承者的特性外,还拥有自己独有得特性。例如猫有抓老鼠、爬树等其他动物没有的特性。同时在继承关系中,继承者完全可以替换被继承者,反之则不可以,例如我们可以说猫是动物,但不能说动物是猫就是这个道理,其实对于这个我们将其称之为“向上转型”。

同时在使用继承时需要记住三句话:

子类拥有父类非private的属性和方法。
子类可以拥有自己属性和方法,即子类可以对父类进行扩展。
子类可以用自己的方式实现父类的方法(重写)。
学习继承一定少不了这三个东西:构造器、protected关键字、向上转型

多态

所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。

对于面向对象而言,多态分为编译时多态和运行时多态。其中编辑时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的函数,通过编辑之后会变成两个不同的函数,在运行时谈不上多态。而运行时多态是动态的,它是通过动态绑定来实现的,也就是我们所说的多态性。

多态的实现条件:继承 重写 向上转型
继承:在多态中必须存在有继承关系的子类和父类。
重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。

只有满足了上述三个条件,我们才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象,从而达到执行不同的行为。

对于Java而言,它多态的实现机制遵循一个原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。

面向对象和面向过程的区别

摘自知乎:
当拿到一个需求的时候:
如果你想到的是循环分支,如何一步一步的实现,这就是面向过程的思想
如果你想到的是需要几个对象,分别调用哪些对象可以实现的时候,就是面向对象的思想。
比如说都是做饭,面向过程就是这样考虑的:首先淘米,然后点火,再把锅放灶上,加热20分钟。
那面向对象呢?要有米,要有灶,还要有锅米可以淘,灶可以点火,锅可以加热米可以是锅的属性或者用方法参数传递给锅。
我的理解就是,面向过程是一步一步细化操作将问题解决,而面向对象是通过调用对象的属性和方法来将问题解决。