谈谈你对面向对象的理解

面向对象常和面向过程做对比,面向对象和面向过程是两种不同的编程思想。

面向过程

面向过程注重解决问题的步骤和顺序。比如洗衣服,面向过程时会将任务拆解成一系列的步骤(函数):

  1. 打开洗衣机
  2. 放衣服
  3. 放洗衣粉
  4. 清洗
  5. 烘干

面向对象

面向对象将任务抽象为对象之间的交互,更注重任务有哪些参与者、各自需要做什么。比如洗衣服,面向对象时会梳理出任务中的各个对象,将其抽象为人与洗衣机之间的交互:

  1. 人打开洗衣机
  2. 人放衣服
  3. 人放洗衣粉
  4. 洗衣机清洗
  5. 洗衣机烘干

面向对象有三大特性:封装、继承和多态。

把对象的属性和方法放到一个类里面,明确标识出该类哪些成员可以被访问,哪些成员不能直接被访问,这就是封装。比如通常将属性设为私有,仅允许通过指定方法来间接访问属性,通过在方法中编写指定代码,来控制访问,所以封装可提升数据的安全性,同时使外部只需知道如何调用 API,而不用考虑被隐藏起来的细节。又比如实现一个供外部调用的方法时,如果中间过程比较复杂,通常会将这些中间过程抽出来放到单独的方法中,同时将方法设置为私有,使外部无法直接访问,因为外部不需要关心内部的实现细节。

继承也就是父类的一些成员,可以被子类重复使用,子类不必再在自己的类里面重新定义一回,父类里有的我们只要拿过来用就好了,所以继承可实现代码复用。而对于自己类里面需要用到的新的成员,子类可以自己扩展。当然,会出现一些特殊情况,就是有一些方法在父类中已经定义好了,但是子类在用的时候,发现需要进行特殊处理,比如普通员工的工资计算方法跟经理的计算方法是不一样的,所以这个时候,我们就不能直接调用父类的这个计算工资的方法了。

这个时候我们就需要用到面向对象的另一个特性,多态。发生重载或重写时才会有多态,但通常主要是指重写。重写就是把子类从父亲类里继承下来的方法重新写一遍,这样,父类里相同的方法就被覆盖了。而重载就是类里面相同方法名,不同方法签名的情况,方法签名由方法名和形参列表决定,与方法的返回值、修饰符无关。子类继承父类,且发生重写时,调用哪个方法取决于对象类型,而不取决于引用类型,也就是父类引用类型的变量指向子类对象时,调用被重写的方法时会调用到子类中的方法。

有时候还会提到抽象,抽象一方面是提取对象中所需要用到的属性和方法,将其抽象为类,另一方面,可以将类抽象为父类或抽象类、将行为抽象为接口。

总结:

  1. 封装:让使用对象的人不考虑内部实现,只考虑功能使用,把内部的代码保护起来,只留出一些个 API 接口供用户使用

  2. 继承:就是为了代码的复用,子类可以从父类上继承出一些方法和属性,子类只需要在父类的基础上做改变或扩展

  3. 多态:实际上是不同对象作用于同一操作产生不同的效果。多态的思想实际上是把“想做什么”和“谁去做”分开

参考:面向对象谈谈你对面向对象的理解?谈一下你对面向对象的理解?编程思想:面向对象和面向过程

posted @ 2022-08-22 20:43  Higurashi-kagome  阅读(65)  评论(0编辑  收藏  举报