您的位置:首页 > 编程语言 > Java开发

面向对象理论概述

2014-06-25 00:00 260 查看
转载自:http://my.oschina.net/brucelee80/blog

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

面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。

例如五子棋,面向过程的设计思路就是首先分析问题的步骤:

1、开始游戏,

2、黑子先走,

3、绘制画面,

4、判断输赢,

5、轮到白子,

6、绘制画面,

7、判断输赢,

8、返回步骤2,

9、输出最后结果。

把上面每个步骤用分别的函数来实现,问题就解决了。

而面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为:

1、黑白双方,这两方的行为是一模一样的,

2、棋盘系统,负责绘制画面,

3、规则系统,负责判定诸如犯规、输赢等。

第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。

可以明显地看出,面向对象是以功能来划分问题,而不是步骤。同样是绘制棋局,这样的行为在面向过程的设计中分散在了总多步骤中,很可能出现不同的绘制版本,因为通常设计人员会考虑到实际情况进行各种各样的简化。而面向对象的设计中,绘图只可能在棋盘对象中出现,从而保证了绘图的统一。

功能上的统一保证了面向对象设计的可扩展性。比如我要加入悔棋的功能,如果要改动面向过程的设计,那么从输入到判断到显示这一连串的步骤都要改动,甚至步骤之间的循序都要进行大规模调整。如果是面向对象的话,只用改动棋盘对象就行了,棋盘系统保存了黑白双方的棋谱,简单回溯就可以了,而显示和规则判断则不用顾及,同时整个对对象功能的调用顺序都没有变化,改动只是局部的。

到这里就可以很明显的看出面向对象和面向过程的区别所在了。

基本概念

抽象、封装、对象、类

面向对象的思想来解决问题,首先要做的是分析该问题包括哪些对象。问题中的实体和概念都可以抽象为对象来考虑。如上面例子中的黑白双方、棋盘系统和规则系统等。

对象具有属性、状态以及行为,状态是属性的值,行为是属性的逻辑操作。对象都属于某个类,而每个对象都是某个类的实例。一个对象就是封装了数据及操作这些数据的逻辑代码的实例。

对具有相同属性和行为的一组对象进行抽象,便成了类,它是对象的模板,而对象是类的实例化,每个对象都对类的属性赋予不同的状态,对象具有唯一性。

7fe0

隐藏与访问控制

封装并不只是简单的属性和行为的集结,更重要的是选择性隐藏与访问控制。隐藏和控制那些不想提供对外访问的属性和行为,提供出去的便是这个对象的服务与功能。对使用者而言,隐藏了对象具体的实现,又提供了对象可控的行为。访问控制提高了安全性,也使协作开发有章可循。

组合、继承

现实世界中,类与类之间不是孤立的,它们是有联系的。

组合是指一个类拥有另外一个类(包含关系),将一个类当做它自己的属性。比如班级类,就可以组合学生、老师这两个类,表示班级由学生和老师组成。

继承是指两个类具有父子关系,父类也称为基类或超类,子类也称为导出类、扩展类或派生类。比如动物类是父类,而飞禽类和走兽类则属于子类,表示分禽类和走兽类都是动物类。凡是父类能用在的地方,都可以用子类来替代,因为子类就是父类,父类是子类的再抽象。比如说动物是生物,当然可以替换成飞禽是生物。

父类的属性和行为,子类可以原封不动的继承下来,也可以重写,以实现每个子类之间各自的新特性。

对象分析时,组合和继承到底选哪一个,是抽象分析和封装时需要考虑的,他们各有优缺点。组合和继承提高了对象的可复用性。

接口、抽象类

接口规范了服务提供的约束。比如电脑USB插槽就约束了USB的各种规范,各种厂商生产的带有USB外接功能的数据线,都必须遵循这个接口约束规范。接口不可实例化,只有实现了接口的类才可被实例化成对象。

抽象类则更像是一个半成品,它只实现了部分功能,而其他功能必须是它的子类去完成。比如公司下发一个申报流程,必须先让部门经理签字,再让部门HR签字,这个流程是实现了的,至于每个部门的经理和HR则要每个部门具体实施时才能确定。所以,抽象类(公司申报流程)也不能直接实例化(因为公司申报流程中根本没有具体的审批人),只能是它的子类(部门申报流程)才能被实例化对象并可用。

转型

当类之间有继承关系时,我们就说子类是父类,这个过程其实就是将子类向上转型为父类,从一个专有类转换成一个通用类,这总是很安全的。相反,如果将父类强制转换为子类,称之为向下转型,向下转型需要强制转型,具有不安全性,因为通用类无法访问专有类的专有行为。比如猫类是动物类的子类,猫类可以抓老鼠,但是向下转型成动物可以抓老鼠,显然就说不通;反之,如果说猫类能行走,那么向上转型为动物类能移动,显然是安全的。

多态

多态也叫动态绑定,或后期绑定。绑定是指方法调用和方法主体关联起来。前期绑定是指在编译时就可确定这种关联,而后期绑定必须在程序处于运行态时才能确定。

在Java中,方法调用的默认方式是前期绑定(由编译器和连接程序实现),当方法出现方法的重载和继承时行为的重写时,那么编译期间就无法进行绑定,这就需要动态绑定。动态绑定使得同样的一个方法,可以有多种实现方式。

比如动物类可以进食,当进食的是水时,它就和进食的是固体所表现的行为就不一样了,这种进食行为是动物类行为的重载,是多态的表现。又比如动物类有移动的行为,而子类飞禽类的移动是飞行,子类走兽类的移动是地面上移动,此时,对于动物类的移动行为,就是多态,当动物是飞禽,移动的行为就变成了飞行的行为,如果是走兽,这个行为又变成了地面上移动,而这一切,只有在运行期才知道,因为只有真正运行起来,程序才知道,这个动物到底是飞禽还是走兽。

多态可以提供系统间的松耦合性。

转载自:http://my.oschina.net/brucelee80/blog
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java面向对象