• 沒有找到結果。

什么是方法

在文檔中 程序设计大学教程 (頁 55-58)

第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 的一个实例)

• 香蕉生长

• 香蕉收获

由此可见,面向对象的程序设计更符合人脑的思维特性,易于阅读和维护。

在文檔中 程序设计大学教程 (頁 55-58)