
3.2 方法
前面的内容中已经使用了不少方法,如setter方法、getter方法、静态方法、工厂方法。现在,讨论方法。
Java中,定义一个方法的格式如下。
<修饰符><返回值类型><方法名>(<参数列表>) { <方法体> }
其中:
□ <修饰符>,确定方法的访问形式(如静态方法)与访问级别(如私有的、公共的等),稍后会有关于修饰符的更多讨论。
□ <返回值类型>,指定方法返回数据的类型,如果方法不需要返回数据,则指定为void。
□ <方法名>,指定方法的名称,一般会使用首字母小写,然后每个单词首字母大写的形式,如getCounter()、moveTo()等。
□ <参数列表>,代入方法的数据,如果没有可以空着。参数可以有一个或多个,多个参数使用逗号分隔,每一个参数都应用包含数据类型和参数变量。
□ <方法体>,作为方法的主体部分,是方法完成工作的地方。如果在方法体中需要返回数据,则使用return语句来完成。实际上,即使方法不需要返回值,也可以使用空的return语句随时终止方法的执行。
下面的代码在CAuto类中添加一个静态方法,用于计算百公里的油耗。

代码中,定义lphkm()方法为公共的静态方法,这样就可以使用CAuto类的名称访问。两个参数分别指定行驶的里程和耗油量,类型也都定义为double。返回值类型定义为double,方法中使用return语句返回百公里油耗。
下面的代码测试lphkm()方法的使用。
public static void main(String[] args) { double l = CAuto.lphkm(1000d, 98d); String s = String.format("百公里油耗为%.2f升",l); System.out.println(s); }

图3-7 调用方法
代码执行结果如图3-7所示。
3.2.1 可变长参数
如果在方法中需要使用零个或多个相同类型的参数,可以通过可变长(variable-length)参数简化参数的定义。
定义可变长参数时,需要在参数类型后加上...运算符。下面的代码在CAuto类中添加join()实例方法,用于向车中添加乘员。

join()方法的参数看上去只有一个,但是,在String后面使用了...运算符,这样,调用join()方法时就可以使用零个或多个String类型的参数。
下面的代码演示了join()方法的使用。
public static void main(String[] args) { CAuto suv = CAutoFactory.createSuv(); suv.join("Tom","Jerry","John"); }
代码执行结果如图3-8所示。
可修改suv.join()方法中的参数数量(零个或多个),并观察执行结果。

图3-8 使用可变长参数
3.2.2 重载
方法的重载是指,多个方法具有相同的名称,但不同的参数定义能够明显地区分方法的版本。调用方法时,可以根据代入的参数自动调用最匹配的版本。实际上,CAuto类的构造函数已经使用了重载。
下面的代码在CAuto类中再添加三个moveTo()方法。

代码中的moveTo()方法中,第一个版本是前面创建的,包括两个int类型的参数;第二个版本包括两个float类型参数;第三个版本使用一个String类型的参数,用于指定目的地名称;第四个版本使用经纬度指定坐标,两个参数定义为double类型。
下面的代码分别调用这四个版本的moveTo()方法。
public static void main(String[] args) { CAuto aerocar = new CAuto("ZX"); aerocar.moveTo(99, 11); aerocar.moveTo(99f, 11f); aerocar.moveTo("那啥地方"); aerocar.moveTo(99.0, 11.0); }

图3-9 方法的重载
第一个moveTo()方法中,因为默认的整数是int类型,所以会调用参数类型为int的版本。第二个moveTo()方法中,指定参数为float类型,所以调用的是参数为float类型的版本。第三个moveTo()方法中,使用String类型的参数。第四个moveTO方法中,因为默认的浮点数是double类型,所以会调用参数为double的版本。
代码执行结果如图3-9所示。