Java程序设计大学教程第三章 面向对象与对象模型面向对象的程序设计( OOP)已成为现代软件开发的必然选择。通过掌握面向对象的技术,能开发出复杂、高级的系统,这些系统是完整健全的,但又是可扩充的。 OOP是建立在把对象作为基本实体看待的面向对象的模型上的,这种模型可以使对象之间能相互交互作用。
面向对象程序设计在一个好的面向对象程序设计语言
( OOPL)的支持下能得到最好的实现。 Java就是一种优秀的 OOPL,它提供了用来支持面向对象程序设计模型所需的一切条件。 Java有自己完善的对象模型,并提供了一个庞大的
Java类库,并有一套完整的面向对象解决方案和体系结构。
本章介绍面向对象的概念和对象建模的方法,讲解 Java
对象模型中的核心部分:类及类的成员。使读者学会如何用创建和使用 Java对象。
Java程序设计大学教程
3.1 面向对象的概念
面向对象方法学是面向对象程序设计技术的理论基础。面向对象程序设计具有符合人类抽象思维的认知习惯,使得程序开发过程与人类的认知过程同步,便于建立规范化的分析设计方法,使程序具有更好的封装性、可读性、可维护性、可重用性等一系列优点。
面向对象技术以基本对象模型为单位,将对象内部处理细节封装在模型内部,重视对象模块间的接口联系和对象与外部环境间的联系,
能层次清晰地表示对象模型。面向对象的特点主要概括为抽象性、
继承性、封装性和多态性。
模型提供了一个物理系统的抽象,模型可以让工程师们忽略无关的细节而把注意力集中到系统的重要部分来进行思考。软件模型除了用于系统设计还可以用在很多的方面,例如预期系统的质量、当系统的某些方面变化时推理特定的属性、测试关键的系统特征等。模型可以先开发出来用于指导物理系统的开发,或者也可以由一个已存在的系统或者开发中的系统产生,作为理解系统行为、优化系统 实现的手段。统一建模语言 UML是一个通用的可视化建模语言,用于对软件进行描述、可视化处理、构造和建立软件系统制品的文档。
Java程序设计大学教程
3.1.1 面向对象基本原理面向对象技术,正是利用对现实世界中对象的抽象和对象之间相互关联和相互作用的描述来对现实世界进行模拟,并且使其映射到目标系统中。所以面向对象的特点主要概括为抽象性、继承性、封装性和多态性。
抽象性 —— 指对现实世界中某一类实体或事件进行抽象,从中提取共同信息,
找出共同规律,反过来又把它们集中在一个集合中,定义为所设计目标系统中的对象。
继承性 —— 新的对象类由继承原有对象类的某些特性或全部特性而产生出来,
原有对象类称为基类(或超类、父类),新的对象类称为派生类(或子类),
派生类可以直接继承基类的共性,又允许派生类发展自己的个性。继承性简化了对新的对象类的设计。
封装性 —— 是指对象的使用者通过预先定义的接口关联到某一对象的服务和数据时,无需知道这些服务是如何实现的。即用户使用对象时无需知道对象内部的运行细节。这样,以前所开发的系统中已使用的对象能够在新系统中重新采用,减少了新系统中分析、设计和编程的工作量。
多态性 —— 是指不同类型的对象可以对相同的激励做出适当的不同相应的能力。
多态性丰富了对象的内容,扩大了对象的适应性,改变了对象单一继承的关系。
Java程序设计大学教程
3.1.2 建立面向对象的思维
对象是建立面向对象程序所依赖的基本单元。用更专业的话来说,
所谓对象就是一种代码的实例,这种代码执行特定的功能,具有自包含或者封装的性质。这种封装代码通常叫做类 。
,封装,的对象具有自己的函数,这种函数被称作,方法,,而对象的属性则被称为,字段,。当对象内部定义了字段的时候,
它们通常不能扩展到实例以外。
用于创建对象的类有一种功能强大的特性,这就是它们可以继承其他类。 在继承了类后,我们可以通过覆盖( override)方法来获得希望的结果。
面向对象强调从问题域的概念到软件程序和界面的直接映射;心理学的研究也表明,把客观世界看成是许多对象更接近人类的自然思维方式。对象比函数更为稳定;软件需求的变动往往是功能相关的变动,而其功能的执行者对象通常不会有大的变动。另外,
面向对象的开发也支持、鼓励软件工程实践中的信息隐藏、数据抽象和封装。在一个对象内部的修改被局部隔离。面向对象开发的软件易于修改、扩充和维护。
Java程序设计大学教程
3.1.3 UML和对象建模
模型与建模 模型提供了一个物理系统的抽象,模型可以让工程师们忽略无关的细节而把注意力集中到系统的重要部分来进行思考。从软件建模技术的发展过程中,
人们认识到建模语言是一种图形化的文档描述性语言,利用它可以解决在软件建模过程中存在的沟通障碍问题。
Java程序设计大学教程
3.1.3 UML和对象建模
统一建模语言
UML是一个通用的可视化建模语言,用于对软件进行描述、可视化处理、构造和建立软件系统制品的文档。它可以把人们对所需要构建系统的想法和理解记录下来,
以便用于对系统的分析、设计、研究、配置和维护。
关联关系泛化关系
(继承关系)
字段方法类名称可见性
( - # +

Java程序设计大学教程
3.1.3 UML和对象建模
使用建模工具建模工具的出现提高了建模的生产力。一个优秀的建模工具应该能够完成模型与代码之间的自动转换,也可以保持设计模型与实现代码在变更时的步调一致。
Java程序设计大学教程
3.2 类
类是对具有共同实现的一些对象或一系列对象的描述。
通俗地讲,如果不同的对象可以根据其类似的属性特征和行为操作划分成不同类型的话,那么决定他们属性特征和行为操作的东西就是类。
例如:对于园丁所种植的香蕉、橘子、葡萄等不同的水果对象,它们有共同的名称属性,以及种植和收获的操作,因此可将它们划归为果园系统中的水果类。
Java程序设计大学教程
3.2.1 什么是 Java类
当用户编写自己的 Java程序时,主要工作就是编写类。
当程序运行时,已声明的类用来创建新对象。由类创建对象的过程称为实例化( instantiation),每个对象都是类的一个新实例( instance)。
类是一种抽象数据类型,在 Java中类也被当作一个数据类型来定义。类的语法结构包括关键字 class、跟在后面的类名称。如果其继承自某个基类,还需要使用 extends
关键字加基类名称。
类通常不需要从头生成。相反,他们可以从其他的类派生而来,继承祖先类的可用类成员,包括:字段、方法等。
即使是从头创建的新类也必须是继承自 Object类,只不过我们可以合法省略 extends Object而已。
class 类名 extends 基类 {
//类的函数成员构造函数 1;
构造函数 2;
...
方法 1;
方法 2;
...
//类的数据成员字段 1;
字段 2;
...
}
Java程序设计大学教程
3.2.2 类成员
类成员包括数据成员和函数成员。
数据成员是面向对象的术语,用于表示类中的数据变量,即 Java中的字段( field)。
函数成员也是面向对象的术语,用于表示类中的操作。 Java的函数成员包括方法和构造函数:
方法是一些封装在类中的过程和函数,用于执行类的操作,完成类的任务。
构造函数是一种特殊的方法,用于对象的创建和初始化。
Java程序设计大学教程
3.2.3 类成员的可访问性
类成员包括数据成员和函数成员,类的每个成员都有一个称为可访问性的属性,用来保护类成员。 Java有四种类成员的保护方式,分别为缺省的,public(公有的),protected(保护的),private(私有的)。
为了使程序具有良好易读的风格,建议最好在撰写类代码时用不同的可访问性来组织类成员,并将 public成员作为对外公布的接口放在最前面,以便引起关注。
限访问修饰符关键字 同一个类中 同一个包中 派生类中 其他包中
public √ √ √ √
protected √ √ √
无访问修饰符关键字 √ √
private √
Java程序设计大学教程
3.3 方法
方法是在类中定义,用来实现对象操作的过程或者函数。方法是类的成员,并有自己的可访问性。 Java程序中,方法的声明和方法的实现是分开的。
方法与普通函数和过程不同,方法只应用于特定类及其祖先类的对象。另外,每一个方法都有一个隐含的参数,称为 this,它引用作为方法调用主体的对象。调用一个方法的语法格式是,对象名,方法名 (实际参数 );
实例字段和实例方法是属于某一具体实例对象的字段和方法,必须先创建这个实例对象,然后才能使用这些字段和方法。对于同一个类创建的不同的实例对象,其字段可以有不同的取值,以反映该对象的不同状态。
除此之外,还有一种通过类就可以直接访问的静态字段和静态方法,这种静态的字段和方法用 static关键字标识,不需要创建实例就可以通过类直接访问。
Java程序设计大学教程
3.4 对象
理解对象
使用对象
对象之间的关系面向对象程序设计中的对象与客观世界中的对象并不是完全相同的概念,他们既有联系又有区别。
所以深刻理解编程中的对象本质将有利于实践面向对象编程和开发。
Java程序设计大学教程
3.4.1 理解对象
对象可以视为一组相关的操作代码和数据的组合
对象是类的实例
对象可以互相协作,共同完成任务
通过继承、组合或封装等方式可以产成新的对象
对象根据特定的意义和用途有不同的划分方法
Java程序设计大学教程
3.4.2 使用对象,设计果园系统
一个面向对象的果园系统假设我们要开发一个最简单的果园系统 GardenSys。用面向对象的方法来分析,这个果园系统至少包括园丁和水果这两个对象。园丁的工作包括种植各种水果,水果的行为包括生长和收获,不同的水果还有不同的名称。园丁种植水果,园丁与水果存在关联关系。
Java程序设计大学教程
3.4.2 使用对象:对象的创建和销毁
对象是通过类创建的,对象是类的动态实例。每个对象都有生命期。一个对象按其生命期来分析,一般有三个阶段,出生、活动、
死亡。而我们在编程中要做的对应为:创建(初始化)、运行、
销毁。
通常,当调用构造函数时,该函数返回一个新分配内存并初始化了的类的实例。
Java构造函数是一种比较特殊的函数,它不能由用户来指定返回类型,只能返回所属类的类型;它也不能由用户来指定其它名称,
只能使用与类名相同的名称。即便如此,我们仍然可以通过方法的重载( overload)来为一个类提供多个不同的构造函数。
在 Java中没有用于销毁和清理对象的析构函数,因为 Java提供了垃圾回收( Garbage Collection,简称 gc)机制负责释放对象所占用的内存空间及相关的其它资源。
Java程序设计大学教程
3.4.2 使用对象:对象和对象变量
从语义上讲,对象是类的实例,类是创建对象的模板;从语言上讲,对象也是类这种数据类型的变量,对象在内存中占有空间。但是在具体使用中,对象与传统的变量,也就是 Java中基本类型的变量有区别。
对象是一种引用类型。对象由类创建,存储在堆中;而对象变量则是对象的引用,存储在栈中。在程序中我们通过对象变量,也就是对象的引用,来操纵对象。
引用类型的演示:
MyClass a,b;//声明 MyClass类型的变量 a和 b,MyClass是一个 Java类
a = new MyClass();//变量 a引用了 MyClass类创建的对象实例
a.myvar = 24;//给对象实例的字段 myvar赋值
b = a; //变量 b得到的是变量 a的一个引用的副本,
//结果使他们都引用了同一个对象实例。
a.myvar = a.myvar+1;//改变对象字段的值
System.out.println(a.myvar); //此时显示 a.myvar值为 25
System.out.println(b.myvar); //此时显示 b.myvar值也为 25
Java程序设计大学教程
3.4.3 对象之间的关系对象之间的关系有:
合成关系(,has— a”)
继承关系(,is— a”)
依赖关系(,use— a”)
面向对象程序设计的高效关键在于它让每个对象负责执行一组相关的任务。如果对象依赖于其他对象负责处理的任务,那么它就去访问负责这个任务的对象。这时第一个对象就请求第二个对象执行任务,即这个对象依赖于另一个对象。另外,一个对象不能直接操作另一个对象内部的数据,它也不应让其他对象直接访问自己的数据。所有的通信都应该通过方法调用来完成。通过对对象数据的封装,就可以使可重用性最大化,减少数据依赖,并且使调试时间最小化。当然,就像面向过程语言中的模块一样,不应该让一个对象负责过多的事情。创建完成少量任务、规模较小的对象会使设计和调试过程都变得较为简单,相反,创建数据复杂、函数众多的对象,则会使开发过程变得极为复杂。
因此理解对象之间的关系可以帮助我们设计出可重用、易维护的代码,降低耦合性,提高灵活性。