8.2 对象家族中的成员
对象家族中有什么呢?有对象的成员方法和对象的成员变量,这些都有什么含义?如何使用它们?在本节中,将会通过实例详细地讲述。
8.2.1 对象的成员方法
方法就是能够让这个对象做什么,或者表现出什么状态的函数。举一个例子,有一个自行车的对象,如何让它停止、如何驾驶它,这些都是前面所提到的方法。方法就是其他编程语言中所提到的函数,而这个函数用来实现对象的某个功能,或表现出对象的某个状态。
什么是成员?成员的意思就是指它是属于对象的,就好比某个俱乐部的成员是属于这个俱乐部的一样。
将前面两个概念连在一起,就很清楚了。所谓的成员方法就是属于对象的,能够让对象做什么或表现出什么状态的函数。
【实例8.2】下面看一个实例。
01 public class object2
02 {
03 void print()
04 {
05 System.out.println("小明是一名优秀的程序员");
06 }
07 public static void main(String[]args)
08 {
09 object2 m=new object2();
10 m.print();
11 }
12 }
【代码说明】从这个程序段中,可以看到“print()”函数其实就是“object2”这个类中的成员方法。要想使用这个成员方法,必须根据这个类“object2”构造出一个对象,再利用这个对象初始化一个对象句柄,这样就可以利用这个句柄来访问这个成员方法。
【运行效果】
小明是一名优秀的程序员
【实例8.3】下面再看一个复杂一点的有关成员方法的实例。
01 public class object3
02 {
03 public void print()
04 {
05 for(int i=0;i<=5;i++)
06 {
07 for(int j=5-i;j>=0;j—)
08 {
09 System.out.print("*");
10 }
11 System.out.println();
12 }
13 }
14 public static void main(String[]args)
15 {
16 object3 pro=new object3();
17 pro.print();
18 }
19 }
【代码说明】在这个程序中,构造了一个方法“print()”,然后构造对象pro,通过pro来访问这个方法。【运行效果】
**
*
【实例8.4】仔细来看看下面的程序,将上面程序改变一下。
01 public class object4
02 {
03 public static void main(String[]args)
04 {
05 for(int i=0;i<=5;i++)
06 {
07 for(int j=5-i;j>=0;j—)
08 {
09 System.out.print("*");
10 }
11 System.out.println();
12 }
13 }
14 }
【代码说明】这段程序没有定义类中的方法“print()”,而是直接输出内容。这是一种面向过程开发的程序。
【运行效果】
**
*
这个程序是否比前面那个程序段读起来要费劲呢?而这个就是面向对象程序设计和面向过程程序设计的最大区别。面向对象的程序设计将这个程序中每个部件(包括成员方法),作为一个模块,等要使用它的时候,再随时调用它们,而面向过程的程序设计,将这个程序的需求按照顺序的步骤来编写。
下面再分析一下实例8.3中的代码,在面向对象的程序设计中,读者一定要学会一点,首先看主运行程序,也就是“public static void main(String[]args){}”。在这个主运行程序中,看到了两句代码。一句是对象初始化语句,一句是利用对象引用成员方法的语句,这样读者就很清楚,这个程序要干什么,然后再仔细地看这个成员方法是干什么的,这样会使整个程序变得越来越轻松。
【实例8.5】成员方法越来越复杂。面向对象的程序设计的思路,会使得程序很容易读。下面再看一个更加复杂的程序,来体会使用成员方法的优点。
01 public class object5
02 {
03 public void print2()
04 {
05 for(int i=5;i>0;i—)
06 {
07 for(int k=0;k<=(5-i);k++)
08 {
09 System.out.print("");
10 }
11 for(int j=1;j<=(2*i-1);j++)
12 {
13 System.out.print("*");
14 }
15 System.out.println();
16 }
17 }
18 public void print1()
19 {
20 for(int i=1;i<=5;i++)
21 {
22 for(int j=0;j<=(5-i);j++)
23 {
24 System.out.print("");
25 }
26 for(int k=1;k<=(2*i-1);k++)
27 {
28 System.out.print("*");
29 }
30 System.out.println();
31 }
32 }
33 public static void main(String[]args)
34 {
35 object5 pro=new object5();
36 pro.print1();
37 pro.print2();
38 }
39 }
【代码说明】这个程序段看起来有点复杂,使用上面说的读程序的方法。首先看看主运行程序,在主运行程序中有3句:一句是对象初始化语句,一句是引用“print1()”方法,最后一句是引用“print2()”方法。然后再看“print1()”和“print2()”两个方法是如何实现的。至于这个方法的实现过程,应该很简单,只不过是一个多层for循环语句而已,读者可以自己分析它的实现过程。
【运行效果】
*
*
成员方法就是函数段,而函数段拥有自己的特性。在定义函数时必须遵照下面的结构:
返回值类型方法名(形式参数)
{
方法体
}
首先来讨论一下返回值类型。什么叫返回值?返回值就是一个函数结果所获得的值,将这个值返回到主程序中,并且将这个值作为主程序中运行的参数的值。
【实例8.6】下面看一个有关返回值的例子。
01 public class object6
02 {
03 int print(int x)
04 {
05 return 2*x;
06 }
07 public static void main(String[]args)
08 {
09 object6 pro=new object6();
10 System.out.println(pro.print(3));
11 }
12 }
【代码说明】这个程序段中,第3行创建了一个“int print(int x)”方法,在这个方法中返回了“2*x”,将这个值带回到主运行程序中去,于是在主运行程序中,根据“pro.print(x)”中的参数“x=3”,得出这个方法的返回值是6。其实还有两个概念希望读者能清楚,就是实参和形参。刚才说的“int print(int x)”中的“x”就是形参,而主运行程序中相同函数的参数被称为实参。
【运行效果】
6
上面说到返回值,但有的函数方法是没有返回值的,那该如何处理呢?在程序设计中,如果一个方法函数没有返回值,那么可以将函数结构中的返回值类型写成“void”,这个就代表此函数无返回值。
【实例8.7】例如下面的程序段。
01 public class object7
02 {
03 void print()
04 {
05 System.out.println("我是一名程序员");
06 }
07 public static void main(String[]args)
08 {
09 object7 pro=new object7();
10 pro.print();
11 }
12 }
【代码说明】第3行定义了print()方法,其只是输出一段内容,并不返回任何值,所以定义为void类型。第10行演示如何调用这个方法。
【运行效果】
我是一个名程序员
【实例8.8】上面的程序段就是一个无返回值类型的程序例子。为了加深印象,下面看一个详细的复杂的实例。
01 public class object8
02 {
03 public int sum(int x, int y, int z)
04 {
05 int sum;
06 return sum=x+y+z;
07 }
08 public int aver(int x, int y, int z)
09 {
10 int aver;
11 return aver=(x+y+z)/3;
12 }
13 void print()
14 {
15 System.out.println("这个就是这个同学的成绩");
16 }
17 public static void main(String[]args)
18 {
19 object8 num=new object8();
20 System.out.println(num.sum(90,80,70));
21 System.out.println(num.aver(90,80,70));
22 num.print();
23 }
24 }
【代码说明】以上的程序中包含无返回值的print()方法(第13~16行),同时也包含了带返回值的方法sum()和aver()(第3~12行)。
【运行效果】
240 80
这个就是这个同学的成绩