什么是面向对象,谈谈你对于面向对象的理解。

面向对象是一种程序设计思想。当我们谈到面向对象的时候总是会谈到面共享过程。那怎么样理解面向过程,又怎么样理解面向对象呢?
其实很好理解,从我们拿到一个需求开始,我们同样想完成一个需求,面向过程的思想着重于完成这个需求的步骤过程,

  • 首先将这一个大的整体的需求细化分解成每个小的步骤
  • 然后安排每个步骤要完成什么样的功能,以及如何完成这样的功能
  • 最后就是将上面的步骤合理的安排其先后顺序,让其最后能够实现一开始的需求。

而面向对象思想在面对一个需求的时候,

  • 首先想的是要完成这个需求功能,涉及到了那些对象,涉及了那些类,
  • 这些类和对象要有什么属性和行为
  • 这些类和对象之间要如何协作完成这样的一个需求。

面向过程思想,先具体逻辑细节,后抽象问题整体;面向对象,先抽象问题整体,后具体逻辑细节,先考虑对象,然后考虑对象里面的行为和属性。在软件开发中,在宏观上,我们使用面向对象来把握事物之间复杂的关系,分析系统;在微观上,仍然是面向过程的。就比如我们抽象出一个类,但是深入到类里面的行为的时候,其实还是面向过程的。

面向对象的思想其实是来源于我们的现实世界。从宏观上来看,现实世界中的事物是由其内部状态,以及围绕其状态的运动规律组成,不同的事物相互联系、相互作用,组成了纷繁复杂的世界。有句话叫:人们应该按照世界原本的样子去认识和理解世界本身。程序世界作为现实世界的一种组成和延申,反映的正是人们对于现实世界的认识。

Java里面的面向对象的思想的理解
Java是一门面向对象的高级语言,面向对象语言的三大特点分别是封装、继承和多态。

封装

就是将一些属性和操作放到一起,将其看作一个整体。为什么要这么做?在软件设计里面,面向对象程序设计的一个重要的原则就是:高内聚,低耦合。这里说的就是类的设计的两个主要的特征:我们现实生活中说到任何一个事物,其大多数的行为都会使用、依赖于自己的一些重要的属性。比如我们描述一个学生,学生的几乎所有的行为里面都要使用或者依赖学号这样的一个属性,再比如我们描述一个鸡(你干嘛!哎呦~~ ^-^),想一下,有关的行为大多都会使用一些诸如品种这样的属性。我们将这些高度相关的属性和操作放到一起,抽象出一个更高层次的东西,这就是类。在类里面的东西是具有高度相关性的,这就是高内聚。
在Java里面的类也是同样的规则 :将数据和对数据的操作封装在一个类里,通过用访问权限修饰符控制外部对数据的访问(为什么要加上访问权限?想一下,如果这个类设计得足够优秀,所有在类里面的东西都是高度相关的,那么如果别人能够轻易地擅自修改,那么是不合理的)。这样的例子在Java里面有:比如我们的将所有的实体类属性设置成私有,只提供给外部公共的get/set方法。
另外封装的作用还有可以对外屏蔽细节,比如工具类方法隐藏内部的细节,外部调用者无需关注内部实现,只需关注业务逻辑。

优点: 封装可以保护数据的完整性和安全性

继承

一个类可以继承另一个类的属性和方法,可以称对父类的扩展/做出自己的改变,可以理解为站在前人的肩膀上继续前进。这其实也是很符合人们的认识的,前人已经有的我可以直接拿来用,别人已经完成的我可以不用再从头开始再完成一遍。用程序设计的话来说就是提高了代码的复用性。(虽然开玩笑说人类的本质是一个复读机,但我想这肯定不是指程序猿群体。因为电脑最擅长干的事情就是步骤明确的,重复执行的事情,所以程序员的思维就是,所有重复干的事情,都想让机器来干。说白了就是懒,懒人改变世界嘛)
通过继承我们还可以实现一个现有类的新特性,在不改变原有类的情况下,满足新的开发需求。Java中的类的继承其实更好的说法是扩展,子类继承的父类,得到了父类中的属性和行为,然后基于此,扩展子类自己的东西。
继承的优点:提高代码的复用性,扩展性

多态

为什么要有多态?其实和封装、继承一样,有一个主要对目的,就是为了提高代码的复用性以及灵活性。
多态产生的前提是条件是:

  • 两个类存在继承关系,
  • 并且子类必须重写父类的同名方法,
  • 然后还要有父类引用指向子类对象。

在这样的前提下,多态就是:调用相同的方法可以表现出多种形态(表现出多种不同的结果,原因就是是父类引用指向了子类对象,基于这个对象虽然引用类型相同,但实际运行时类型不相同,而调用方法体现行为是根据运行时类型来决定的)。

举例: 提供了一套统一的接口的程序设计模式,使得我们可以基于接口编程。比如在选用集合类的业务时,改变指向的子类集合对象不需要修改其它业务代码,

优点: 提高代码的灵活性,可扩展性