点击这里给我发消息 点击这里给我发消息

面向对象的程序设计

添加时间:2013-12-7
    相关阅读: 设计 开发 技术 模板 程序 框架 维护
 

正像本章开始所说的,Java是一个面向对象的程序设计语言。在使用非面向对象的程序设计语言时,'你必须用数值、字符,即语言中可以处理的基本数据类型,来求解各种问题。

而在像Java这样的面向对象语言中,情况就截然不同了。当然,你还是要对数值和字符进行操作,它们被称为蔫本数据类型(basic data types ),但你也可以定义与特定问题相关的其他实体类型。你将依据与问题相关的实体或对象解决问题。这不但影响一个程序的结构,而且解决问题所表达的术语也不尽相同。如果你的程序涉及到棒球运动员,Java程序中就可能需要包括一个BaseballPlayer对象;如果你编制一个程序涉及California的水果产品,就有可能需要包含Oranges对象。实际上,除了外在感觉外,面向对象的程序通常比较容易理解。在Java语言中,几乎所有事物都是对象。如果你以前没有学习过面向对象的程序设计,可能会感到一丝恐惧。请不要害怕,Java中的对象非常简单。事实上,我们马上就要开始了解在Java对象背后的一些概念。这样一来,从一开始你就站在了正确的跑道上。

这并不意味着我们马上就陷入用Java描述和使用对象的细节,在此我们只给出概念。我们从在Java代码中使用奇数位这一基础开始学习,逐步帮助我们理清概念。对于这里的所有代码,我们将在后续章节中讲解。首先,我们集中理解清楚对象的含义,然后就可以轻松地在实践中将它分析、研究透彻,使之不断深入。

什么是对象?

任何事物都可以被看成是一个对象,对象随处可见。你可以把Tree(树)看作是一个特殊的对象类,一般所说的树是一个非常抽象的类,这是由于你很难找到一种能够概括所有树种的树。因此,在我的花园中,橡树,我就叫它myoak;在你的花园中,枝树,你叫它thatDarnedTree;而generalSherrnan是一种闻名的红木。它们都是树的特例,也就是说,橡树、按树和红木都是树的子类。注意,在这里我们将引入类(class)这个犬语,它是一个描述具有共同特性的对象集合的规格说明( specification).类是表达规格说明或者模板的程序段,它定义了特定对象的组织方式。子类也是一个类,它继承了父类的所有特性,除此之外又有自己的特殊属性。当然,定义的类要符合你的需求,它并没有绝对的框架。对于一个很小的问题,Tree类的规格说明可能只包含树的种类和高度。如果你是一个树木栽培家,有关树的信息要求得可能更加复杂,可能是一个类集,它包含了很多种树木。

程序中使用的每个对象都会在某处有与之对应的类定义,这一点对于lava语言或其他面向对象的语言来说都是相同的。在程序设计中,类的基本概念与现实世界中的物种分类基本一致,它是将事物组织在一起的一种习惯,并且是一种极好的定义方式。

类的实例(instance)是一个技术术语。它描述了一个己有的对象。Ash是一个对象的规格说明,而yourAsh就是构成该规格说明的一个对象,因此yourAsh就是类Ash的一个实例。一旦你定义了一个类,就可以说明其对象,又称该类的实例。这就产生了一个问题。

对象的操作

类与其他语言的复杂数据类型之间,最根本的差异是类定义中包含着更多的信息。这些信息主要说明你可以用类对象做些什么事情,也就是类对象可能的操作。显然,程序中的对象是有特定用途的,你需要决定将来对它们进行一些什么操作。这将取决于对象类型、包含的属性以及你打算如何使用这些类对象。

举一个很简单的例子,假如你的对象是一个Integer类型数值,它被计划实施普通的算术运算:加、减、乘和除,大概你还可以提出来一些其他运算。有些操作可能毫无意义,比如计算Integer的范围、压缩Integer或者扩展Integer,而这些操作对于非整型的其他类来讲,可能是有意义的。回到前面的CowbnyHat类,你可能想设计两个分别称为putHatQn(戴帽)和talfeHat}ff(摘帽)的操作,从它们的名字就可以知道它们的含义,以及对CowhoyHat对象的意义。

然而,只有当CowbayHat对象有一个记录帽子是否被戴在头上的属性时,这些操作才有意义。对一个给定的CowboyHat对象,这个操作可以设定该对象的属性值。当决定CnwbnyHat是否被戴在头上时,就要查看这个属性值了。可以想像,你还可以有一个Change}wner操作,其功能是把记录目前帽子拥有者名字的实例变量设定一个新值。示意图中显示了对CowboyHat对象应用的连续两个操作。

你可能想知道定义的类应如何操作。如同我们稍后将看到的,简称为方法(method)的自包含程序代码块用给定的名称进行标识。你可以将整型数、浮点型数、字符串或类对象传递给方法,方法也可以返回一个数据项。在对象上执行一个操作等于执行这个对象定义的方法。让我们看一个完整的类定义例子。我们刚刚讲过的CowboyHat类的代码如下所示:

这段代码被保存在名字为CowboyHat.java的文件中,文样的名称总与类的名称相同,由于这个文件包含源代码,所以文件的扩展名为。Java

类定义的代码显示在类标识后面的大括号内,如图所示。类中所有方法的代码均出现在大括号内。这个类有4个实例变量:owner. type size和hatOn,最后这个变量永远被初始化为false.按照这个类说明所建立的每个对象,都存储其实例变量的独立拷贝,因此每个对象中的实例变量可以有惟一的值。

关键字private被应用于每个实例变量,以确保只有类中的方法才可以直接地访问或更改它们。类方法也可以说明为private.其主要功能是可以防止类以外的一些成员的访问,以保护类内部被错误地更改或使用。在其他程序中,若使用了你定义的类,只能访问你想让它们访问的内容。这意味着你可以更改类内部private方法的操作方式,而不会影响使用它的其他程序。

这个类还有5个方法,你可以对CawbayHat对象做5项不同的操作。其中一个被称作构造函数(constructor)的特殊方法用来建立CowboyHat对象,构造函数的名称与类名相同。跟在构造函数后面括号内的参数,指定该函数执行时,传递给该方法的数据。

Java程序语句

正像你在CowhoyHat类的例子中所看到的,类中每个方法的代码均显示在大括号内,它由程序语句(program statement)组成,每条程序语句以分号结束。在Java中,一条语句如果需要的话可以延伸数行,这是因为每条语句以分号(;)作为结束标志,而不是行尾。

这里是一条Java程序语句:

hatOn = false;

如果你愿意的话,也可以把它写成:

hatOn =

       false;


通常情况下,可以在语句中包含空格和制表符,并通过用多行表示一条语句来增强程序的可读性,但也存在着一些明显的限制。比如,不能在名称中间插入空格。如果写成hat an,编译器会将它识别为两个单词。

封装

在这里我们要介绍另一个术语-封装(encapsulation ).封装是指对象中被隐蔽的数据项和方法,它们在类定义中被说明为private.在CowboyHat类中,实例变量owner,type,size和hatOn都被封装了起来。它们只能通过类定义中的方法来访问。用这种方式封装类中的成员,对于类对象的安全性和完整性都是非常重要的。你可能有一个拥有数据成员的类,这些数据成员包含的数值有一些特定的要求,通过隐蔽这些数据成员并强迫使用方法来设置或者改变它们,就可以确保其内容设置的合理性。

前面提到的封装还有另一个优点就是隐蔽类的实现功能。允许有限地访问类中的成员,使得你可以不修改使用该类的应用程序,而随意地改变类的内部实现。只要方法的接口不发生变化,内部的代码就可以按你的意愿任意的改变。

一个特定的对象,实例CowboyEiat由封装的实例变量owner, type, sire和表示帽子状态的hatan组成。只有构造函数、putHatOn{)方法、takeHatOff()方法和getSixe{)方法可以由外部访问。

类与数据类型

程序设计会涉及对声明的各种类型数据进行处理、传递、操纵、转换。因为类定义的是程序将要操作的对象类型,所以你叫一以认为定义类和定义数据类型是相同的。也就是说,Hat是一种数据类型,Tree也是一种数据类型,实际上你定义的任何其他类都是数据类型。

Java本身还有一个标准类库,它为你提供了少"泛的编程。丁具与设备口很大程度上,Java程序的土作都是处理、发送、操纵或者转换类对象。

在Java中,有一些基木数据类型不属于类,我们将在下一章进行深入地探讨。但它们主要用丁99或者3.75这样的数值,"A"或者"?"这样的单个字符,还有只有true, false两个值的逻辑型数据类型Java也有对应于基本类型的类,其原囚我们将在后面阐述。在java程序中,任何实体都是类对象,不是自己定义的类,就是Java环境提供给你的类或者是从其他地方获得的类,如从一个特定的支持包中获得的类。

类和子类

  在一个类中,你可以将定义的对象划分为更加具体的子集,每个子集也用类来描述,并且Java给你提供了一种功能,可以定义一个类的特殊类,这就更加自然地反映了现实状况。就好像可以有很多种方法来划分蛋糕或者森林一样。例如,Conifer可以是类Tree的一个子类。Conifer类其有Tree类的所有实例变量和方法。此外还有一些属于Conifer类的特定的实例变量和方法。你可以称Conifer是Tree类的子类,而Tree类是Conife:类的基类二当你从一个类比如Tree出发,定义另一个类比如Conife;时,Conifer类就被认为是由Tree类派生的,并且继承了Tree类的所有属性。

使用对象的益处

正如我们开始所说的,在面向对象的程序设计中,使用对象描述要求解的问题。例如,弹球器模拟机可以定义和使用Table, Ball, Flipper和Bumper这几种类对象。这样设计具有很大的益处,不但利于开发,而且利于程序的扩展。Java提供了大量的标准类库来帮助你开发应用程序、并且你还可以开发自己的通用类,为日后的开发奠定一个良好的基础。因为对象封装了可以运行的方法和定义该类的数据,所以用对象进行程序设计不易出错。面向对象的Java程序,应该比相应的面向过程式的语言程序更加完善。面向对象的程序L匕非对象的程序设计所花费的时间稍长一些,这是因为你必须仔细地考虑设计的类,但是编写和检测代码所需的时间实际上往往比面向过程式的程序要少。面向对象的程序比较容易维护、扩展。

咨询热线:020-85648757 85648755 85648616 0755-27912581 客服:020-85648756 0755-27912581 业务传真:020-32579052
广州市网景网络科技有限公司 Copyright◎2003-2008 Veelink.com. All Rights Reserved.
广州商务地址:广东省广州市黄埔大道中203号(海景园区)海景花园C栋501室
= 深圳商务地址:深圳市宝源路华丰宝源大厦606
研发中心:广东广州市天河软件园海景园区 粤ICP备05103322号 工商注册