Java王者归来:从入门迈向高手
上QQ阅读APP看书,第一时间看更新

8-6 再谈方法

在前面各节的类实例中,所有的方法都是简单没有传递任何参数或是没有任何返回值,这一节将讲解更多方法的应用。

8-6-1 基本参数的传递

在设计类的方法时,也可以增加传递参数给方法。

程序实例ch8_7.java:使用银行存款了解基本参数传递的方法与意义。

执行结果

上述第18行是输出存款前的账户余额,第19行是存款100元,这时A.saveMoney(100)会将100传给类内的saveMoney(int save)方法,程序第5行会执行将此100与原先的余额相加。第20行是输出存款后的账户余额。上述是传递整数参数,其实读者可以将它扩充,传递任何Java合法的数据类型。

8-6-2 认识形参与实参

方法内定义的参数称为形参,以实例ch8_7.java为例,指的是第4行的save。main()内的参数称为实参,以实例ch8_7.java为例,指的是第19行的100。在此笔者统称参数(Parameter)。

8-6-3 参数传递的方法

参数传递有两种,分别是传递值(call by value)和传递地址(call by address)。

1.传递值

main()内调用方法时,main()的实参值会传给方法的形参,在内存内main()的实参与方法的形参各自有不同的内存空间。

程序实例ch8_8.java:传递值的应用。一个数据交换失败的实例,这个程序中第2行使用下列方式声明swap()方法。

在9-3节中会完整说明在void前面加上public static的目的与意义,在此读者只要了解先加上public static即可。

执行结果

上述程序执行至第13行时,刚进入第2行swap()时,内存图示如下所示。

进入到swap()方法的第3行后,内存图式如下。

执行完第5行后,内存图示如下。

所以执行第6行时,可以得到x=20,y=10。但是返回main()的第14行输出x和y时,因为main()的x和y内容未改变,所以得到x=10,y=20。

2.传递地址

在Java程序中当所传递的参数是数组或类时,是参照数据类型,所传递的就是地址,下面将以实例配合内存图示说明。

程序实例ch8_9.java:传递地址的应用。一个数据交换成功的实例。

执行结果

上述程序执行到第14行时,内存图示如下。

当执行第16行进入swap()方法,然后进入第6行执行完毕时,内存图示如下。

第8行执行完毕后,内存图示如下。

所以执行第9行和返回main()执行第17行时,可以得到x=20,y=10。

8-6-4 方法的返回值

在Java中也可以让方法返回执行结果,此时语法格式如下。

有关返回值可以是表达式的观念,可以参考ch8_11.java的sub()方法。

程序实例ch8_10.java:重新设计程序实例ch8_7.java,这个程序主要是增加saveMoney()方法的返回值,返回值是布尔值true或false。如果执行存款时,存款金额一定是正值,但是程序实例ch8_7.java若是输入负值时,程序仍可运作,此时存款金额会变少,这就是语意上的错误,所以这个程序会对存款金额做检查,如果是正值则执行存款,同时存款完成后列出存款成功,可参考第24行和第25行。如果存款金额是负值,将不执行存款,然后列出存款失败,可参考第27行和第28行。

执行结果

程序实例ch8_11.java:设计一个小型运算的类SmallMath,这个类内有两个整数方法分别是可以执行加法的add()和可以执行减法的sub(),可以分别返回加法和减法的运算结果。在add()方法设计中使用中规中矩的方式,设立变量z,然后返回z。在sub()方法中,则是更有效率的使用方法,直接返回“x-y”的运算结果。

执行结果

8-6-5 可变参数的设计

前面所介绍的Java所传递的参数数量是固定的,Java也接受所传递的参数数量是可变的,只需在最后一个参数类型右边加上三个点(…)即可,语法格式如下。

实例1:下面是一个可变参数设计。

上述“inty”表示可以接受多个参数,这些参数会被当作数组输入,另外,设计时须留意下列事项。

(1)一个方法只能有一个可变参数,同时必须在最右边。

(2)可变参数本质是一个数组,因此在调用此方法时,可以传递多个参数,也可以传递一个数组。

程序实例ch8_11_1.java:可变参数的应用。这个程序将用三组不同的数据测试可变参数的执行结果。

执行结果