每日一题:详解面向对象

面向对象与面向过程

最初,软件开发所使用的思想都是面向过程,面向过程的模式更适合计算机运算,或者说更贴近于人类大脑的理解模式。然而随着时代的发展,软件系统也越来越复杂,规模越来越大,面向过程的弊端逐渐显现出来,最关键的在于面向过程开发出的软件系统更难维护,代码耦合度较高,当需求变更后,每次都需要修改大量的代码。

面向对象的出现则解决了这些问题,当然有付出才有回报,相比与面向过程,面向对象思想下的代码也有以下缺点:

  • 可读性相对于面向过程更差一些,主要是因为面向对象的代码较为零散
  • 性能比面向过程的代码要低,因为面向对象的代码执行过程中需要不断的处理类的创建和销毁之类的操作,资源占用比面向过程要大。

总而言之,面向过程和面向对象并没有谁优谁劣,只是适用范围不同,如果说项目比较简单,也不太需要关心后期变更的问题,面向过程可以让你更快的构建项目,如果说项目规模比较大,后期项目会有较长的维护期,那从需求分析开始,你就需要以面向对象的思想来处理。

面向对象的三个特点

  • 封装

之前提到需要以面向对象的思想来处理问题,首先的第一步就是抽象,将这个花花世界中我们关心的东西抽象为一个类,一个可以描述我们关心的东西的类。任何一件物品从不同角度来看都能抽象出不同的属性,因为关注点不一样,一个人如果从医生的角度去抽象,我们可能关心的是身高、体重、身体状况、睡眠情况、饮食情况等等,而从一个设计师的角度去抽象,我们关心的可能就是身高、体重、性别、性格、喜欢的颜色、三围等等

抽象就是以某一个视角来看待这个世界中的东西并将其封装为类,将我们关心的属性作为类的属性,我们关心的动作作为方法,然后通过控制其属性和方法是否为私有来控制是否可以被外界访问

  • 继承

继承实现在封装的基础之上,我们在封装类时会遇到多个类拥有重复的属性或方法,而继承可以让一个类完全拥有另一个类的公共属性和公共方法,这样我们可以减少封装时的重复内容,也可以在不修改类代码的情况下对类进行扩展。

被继承的类我们一般称之为超类、基类或父类,而继承父类的类我们一般称之为子类。继承在设计中一般都是大类到小类的过程,父类和子类的关系为“is a”,例如封装一个动物类,然后通过继承实现一个子类,例如狗,这样狗拥有动物的所有特征,之后便可在子类中继续编写狗特有的属性和方法,父子类的关系可描述为狗是一种动物。

注:虽然说继承是众多开发语言都具备的功能,但继承也存在很大的代码耦合问题,父类的代码一旦变更则会导致所有子类都会跟着改变,所以开发过程中尽可能的使用接口来代替继承。

  • 多态

多态是在继承基础之上衍生出的,变量所引用的对象类型在运行期间由程序决定。多态的必要条件为继承,多态双方必须为父子类,父类在运行期间决定由哪个子类来执行具体操作,换句话说父类变量在程序运行期间决定指向哪个子类对象。同样,因为子类继承了父类的所有方法且存在自定义方法的可能,所以多态的情况下父类无法获取或执行只存在于子类中的属性或方法。

详细了解可参考《java提高篇(四)-----理解java的三大特性之多态

原文地址:https://www.cnblogs.com/aotian/p/9722454.html