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 这个就是这个同学的成绩
8.2.2 对象的成员变量
成员变量是什么呢?理解了成员方法,一定可以知道成员变量是什么。成员变量就是对象所拥有的、并且代表对象的属性值,例如一个自行车对象,它的颜色、材料等都是自行车的属性值,也可以说是它的成员变量。
提起成员变量,就想到前面讲过的局部变量。其实这里说的成员变量相当于前面说过的类变量。它也可以不用初始化,系统自动给它赋值。局部变量就不能不初始化了,否则在编译的时候会报错,前面已经有过实例,此小节就不再赘述。