第3章 面向对象与对象模型
3. 使用建模工具
3.3.1 什么是方法
方法是在类中定义,用来实现对象操作的过程或者函数。方法是属于一个给定对象的过 程和函数,方法反映的是对象的行为而不是数据。方法是类的成员,通过设置保护方式即可 访问性来确定它的调用范围。Java 程序中,方法的声明和方法的实现是不分开的。
示例程序 3-1 是一个水果类 Fruit 的程序代码,该程序保存在 Fruit.java 源文件中。Java
程序员习惯将每个类放在一个独立的源文件中,并使用这个类的名称作为文件名,.java 作 为扩展名。图 3-6 显示了 Fruit 类的 UML 类图及其类成员结构组成。
图 3-6 Fruit 类的 UML 类图及其类成员结构组成
Fruit 类有 2 个可访问性为 private 的数据成员 input 和 fruitName,分别用于存储水果的 投入和水果的名称,因为该私有成员仅供在Fruit 类内部使用,所以受到严格的保护。Fruit 类的函数成员包括:构造函数Fruit 和 3 个方法 grow、harvest 和 gain,他们是公有成员,可 访问性为public,可以被外部其他对象调用。grow 和 harvest 方法实现水果生长和收获的操 作。gain 方法计算并返回种植水果的收益(这里假设收益是投入的两倍)。
Java 中的构造函数是一种用于创建类的实例的特殊方法,它使用与类名称相同的名称作 为方法名。我们还可以在构造函数中实现一些初始化的工作,例如在构造函数Fruit 中,我 们为input 和 fruitName 字段赋初值。如果我们没有在类中撰写自己的构造函数,编译器会 代为创建一个没有参数的隐含构造方法,以保证这个类可以创建。
通常方法可分为有返回值和没有返回值的两种,类似于传统程序中的函数和过程。有返 回值方法必须标明返回值的类型。例如 int gain()表明 gain 方法返回值是整数类型,该值是 通过方法中的return 关键字将变量 g 的值作为返回值。
没有返回值方法必须标明void 关键字。例如 grow、harvest 等使用 void 关键字的方法则 无返回值。
示例程序 3-1 Fruit 类的定义及实现代码 1: public class Fruit {
2: public Fruit(String fname, int in) { 3: fruitName=fname;
4: input=in;
5: } 6:
7: public int gain() {
8: int g=input*2;//收益是投入的两倍 9: return g;
10: } 11:
12: public void grow() {
13: System.out.println(fruitName+"生长...");
14: } 15:
16: public void harvest() {
17: System.out.println(fruitName+"收获...");
18: } 19:
20: private int input;
21: private String fruitName;
22: }
方法与传统的函数和过程不同,是因为方法只应用于特定类及其祖先类的对象。另外,
每一个方法都有一个隐含的参数,称为this,它引用作为方法调用主体的对象,这也是普通 函数和过程所没有的。例如在一个园丁类Gardener 的 work 方法中所调用的 plant 和 gain 方 法就都有一个隐含的参数this:
public void work() {
System.out.println(gardenerName + "开始工作");
plant();//plant 有一个隐含的参数 this,因此可以写成 this.plant() this.gain();//标出参数 this 这样写可以提醒自己区别 Fruit 的 gain 方法,
//或其他同名变量。
}
于是外部程序通过Gardener 的实例对象 gardener 来调用这个方法时,即:
gardener.work();
就会执行到work 方法中的以下指令:
gardener.plant();
gardener.gain();
其中的 gardener 就是通过隐含参数 this 传递进 work 方法中的。
调用方法要以对象实例作为方法名称的开头,例如在一个园丁类Gardener 的 plant 方法 中就创建了一个水果对象fruit,并调用该水果对象的 grow 、harvest 和 gain 方法:
private void plant() { ...
banana = new Fruit("香蕉", 1000);//创建 Fruit 的实例对象 banana banana.grow();//调用 banana 对象实例的 grow 方法
banana.harvest();//调用 banana 对象实例的 harvest 方法 ...
}
显然从这段程序代码中我们不难看出园丁类 Gardener 的种植方法 plant 实现了以下操 作:
• 创建香蕉对象(香蕉是Fruit 的一个实例)
• 香蕉生长
• 香蕉收获
由此可见,面向对象的程序设计更符合人脑的思维特性,易于阅读和维护。