我对面向对象的理解

来源:互联网 发布:java年月日时分秒插件 编辑:程序博客网 时间:2024/04/29 00:20

在现实生活中遇到问题时,绝大数人都是按照次序思维来思考解决之道的。解决者往往先提出一套解决问题的步骤,这些步骤是有先后顺序的,这种顺序就是一种过程。在提出一套可行的解决方案后,依此先做什么、后做什么,往往能够解决问题。对于那些做得比较好的人,我们常称其做事有条理、有逻辑。

同样,在程序设计的世界里,程序员用程序设计语言来描述计算机解决问题的过程。面向过程的编程体现了程序员的逻辑性。如何设计语句的次序,如何组织函数、如何设计函数的参数、如何设计过程分支等等都体现了程序员的逻辑能力。在处理一个具体问题的时候,程序员的脑海里呈现出一套解决问题的步骤,这些步骤是有序、具逻辑性的。

但是,不同的人思考问题的方式不同,而且逻辑的创造能力和理解能力因人而异。不同程序员编程时的逻辑是不同的。当面对日趋复杂的应用系统时,处理问题的完整逻辑就很难理清。并且,即使公司上层理清他们的整套逻辑,提出了解决问题的步骤,其他人很可能不能完全理清这套方案的逻辑性。这在实际项目开发的过程中会带来很大的麻烦,不仅会拖慢项目的进度,而且可能会使软件产品出现逻辑错误。再者,这种面向过程的编程的程序一般情况下只能解决特定的问题,要照搬到其它系统中往往不怎么现实。

其实,再仔细分析可以发现,一个问题中总包含有客体。例如在一个学生信息管理系统中,客体无非就是学生和教职工。在自然界中,每个客体都有属性和行为。如学生有学号和年龄属性,有上课、考试行为。我们可以想到,解决问题的基本方式其实就是让这些特定客体之间相互作用,例如,上课就是老师教授学生知识。

有了这样的思想,面向对象的方法就产生了,并在上世纪90年代就得到了广泛应用。面向对象的方法解决问题的大致思路就是把事物客体抽象成类,每个对象都是属于该类的客体,在类中定义所属客体具备的共同的属性和行为;要促成事件时,只需根据类定义一个对象,再使用这个对象的行为。面向对象的本质是把事物客体看作抽象的对象,这会使复杂软件的开发变得更容易。但是,同时对程序员的能力要求更高了,尤其是抽象能力,即要求程序员能够把若干客体归结为一个具有特定属性和行为的类。

提到对象就不得不提到类。类是对具有相同属性和行为的对象的抽象,是属性与方法的集合。如全校的学生都有学号、都要上课,所以我们可以把所有学生抽象为一个学生类,相应的,教师有教工号、要授课,我们可以把所有教师抽象为一个教师类。在解决问题的过程中涉及到具体个体对象时,我们必须先遵从它所属类的格式,给个体对象赋予属性值以标识对象,之后就决定了该对象也具备了类里定义的行为和功能了。

我们知道,每种编程语言都定义好了若干基本数据类型,如整型、浮点型、字符型,那为什么在编程时还要创建新的“类”类型呢?实际上,现实生活中的客体往往不是用这些基本的数据类型就能表示的,而往往综合使用的各种数据类型。如为了表示一个学生,学生的基本信息由姓名、年龄、学号等。而且,在类上定义功能比在客体上定义功能要方便得多。如对于功能学生上课,面向过程的方法可能会给每个学生都定义上课功能,但在面向对象的方法中只需在类中定义学生共有的功能—上课,当一个学生对象创建时就具备了上课的功能。在具体编程时,我们还常为了实现数据的封装、提高数据的安全性,把类的属性声明为私有的,而把类的方法声明为公共的。这样,对象能够直接调用类中定义的所有方法,当对象想要修改或得到自己的属性的时候就必须要调用以定义好的专用的方法才能够实现即对象调方法,方法改属性。

面向对象的编程有封装、继承、多态三大特性。每个对象都包含了它能进行操作所需要的所有信息,因此对象不必依靠其它的对象来完成自己的操作,这样的特性叫封装。一般我们要新建一个“类”类型时就把该类型的属性和行为的定义封装在一个类中。继承的特点是,以一个子类格式创建的对象除具备子类中定义的属性和方法外,还具备该子类的父类中定义的一切属性和方法。继承的最大好处是可以实现代码复用,大大简化代码的书写。多态允许将父类对象设置成为和一个和多个它的子对象相等,父类对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。也就是说,父类对象具备了子类对象的方法。

很多情况下,我们会不知不觉的按照过程方式来解决问题,而不是考虑将要解决问题抽象为对象去解决它。面向过程的逻辑性能力对于每个程序员来说还是很重要的,因为绝大多数程序从大局看都是面向过程的。而对于模块的结构、功能的结构和函数的结构等都应该用面向对象的思维进行设计。从面向过程编程到面向对象编程是个思维方式提升的过程。当我们能从具体的程序抽象出对象,并能把这个对象用于其它程序,那么我们也能成为一名优秀程序员了。


一些地方是从别的博客看到的,别扔砖啊!

原创粉丝点击