第2章 面向对象程序设计初步
本章从面向对象的概念出发,介绍了程序设计种类、面向对象程序设计的特征;介绍了面向对象程序设计中的对象、类、属性等重要概念;并描述了类、属性、方法的定义和声明;讲述了类的构造器的概念及使用,介绍对象的创建和使用。讲述如何通过类的定义来实现信息隐藏和封装;介绍了Java源文件的结构,package和import的用法;JDK中的常用的包。
2.1 面向对象概念
2.1.1 从结构化程序设计到面向对象程序设计
面向对象程序设计与结构化程序设计都是设计和构造程序的方法。近年来面向对象程序设计的方法越来越受到人们的重视,成为解决软件危机的新途径,而结构化程序设计方法的使用在逐渐减少。几乎每一种最新推出的程序开发工具或语言都采用了面向对象程序设计的思路,面向对象程序设计形成了一套与结构化程序设计具有很大差异的方法。
结构化程序设计方法又称面向过程设计方法,起源于20世纪70年代。在这之前的程序设计基本采用过程式程序设计,虽然汇编语言已经取代了机器语言,但是对于一般的程序设计人员而言,它还是太抽象、太隐晦了。如果计算机要得到更大的发展,必须发明一些比汇编语言更易于阅读、编写的程序语言。在这种需求的刺激下,结构化程序设计方式产生了机构化程序设计,主要特点是采用自顶向下、逐步求精的程序设计方法:使用3种基本控制结构构造程序,任何程序都可由顺序、选择、重复3种基本控制结构构造。结构化设计的根本目标就是把复杂的系统分解成简单模块的层次结构。例如,你要装修房子,以前的过程式程序设计要求你必须从客厅开始装修,然后是卧室、厨房、卫生间,顺序不能颠倒,客厅没装好之前,休想踏进你的卧室半步。而结构化程序设计方式将你的客厅、卧室、卫生间、厨房都独立成一个模块,互相之间可以互不干扰地进行。
虽然结构化程序设计解决了软件设计开发中的一部分问题,但是它仍然存在不足。用结构化方法开发的软件,其稳定性、可修改性和可重用性都比较差,这是因为结构化方法的本质是功能分解,从代表目标系统整体功能的单个处理着手,自顶向下不断把复杂的处理分解为子处理,这样一层一层地分解下去,直到仅剩下若干个容易实现的子处理功能为止,然后用相应的工具来描述各个最低层的处理。因此,结构化方法是围绕实现处理功能的“过程”来构造系统的。然而,用户需求的变化大部分是针对功能的,因此,这种变化对于基于过程的设计来说是灾难性的。用这种方法设计出来的系统结构常常是不稳定的,用户需求的变化往往造成系统结构的较大变化,从而需要花费很大代价才能实现这种变化。
结构化程序设计的局限性催生了面向对象的思想。面向对象(OO)并不是一个新概念,它在20世纪70年代就出现了,但是,因为受到软/硬件的限制,直到90年代,它才为大众所接受并成为程序设计的主流思想。面向对象的方法与结构化的程序设计根本区别在于把系统看成一起工作来完成某项任务的对象集合,而对象是系统对消息做出响应的事物,所以面向对象方法中最值得关注的不是它应该做什么,而是它如何做出反应,也就是消息,这是和结构化设计的根本不同。
在面向对象的设计思想指导下,产生了第一个面向对象的语言——20 世纪60年代的Simula-67。它的目的是解决模拟问题。一个典型的应用是模拟银行系统的运作(银行是最早采用计算机的行业之一),将银行的出纳部门、客户、业务等实体模拟成一个个的对象,把这些在程序的运行中除了状态外其他方面都一样的对象归纳在一起,就成了更高抽象层面的“类”。在面向对象思想指导下产生了成功的面向对象编程语言——Smalltalk。并且,在此基础上又诞生了应用更加广泛的面向对象编程语言——C++及Java。
2.1.2 面向对象特征
1.对象唯一性
每个对象都有自身唯一的标识,通过这种标识,可找到相应的对象。在对象的整个生命期中,它的标识都不改变,不同的对象不能有相同的标识。
2.抽象性
抽象性是指将具有一致的数据结构(属性)和行为(操作)的对象抽象成类。一个类就是这样一种抽象,它反映了与应用有关的重要性质,而忽略其他一些无关内容。任何类的划分都是主观的,但必须与具体的应用有关。
3.封装性
封装性就是把对象的属性和服务结合成一个独立的单位,并尽可能隐蔽对象的内部细节。
4.继承性
继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。
继承性是面向对象程序设计语言不同于其他语言的最重要的特点,是其他语言所没有的。
5.多态性
多态性是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。不同的对象收到同一消息可以产生不同的结果,这种现象称为多态性。