6.4 重载
你可能注意到了,circleArea 和 calculateArea 的功能类似,都用于计算圆的面积,只是接受的参数不同:要想调用 calculateArea,必须提供半径,而调用 circleArea 则需要提供两个点的坐标。
如果两个方法所做的事情相同,那么自然应该给它们指定相同的名称。多个方法同名被称为重载(overloading),这在 Java 中是合法的,但前提条件是每个版本接受的参数不同。因此,我们可以将 circleArea 重命名为 calculateArea:
public static double calculateArea(double xc, double yc, double xp, double yp) {return calculateArea(distance(xc, yc, xp, yp));}
请注意,这个方法并不是递归方法。当调用重载的方法时,Java 会根据你提供的实参判断要调用的是哪个版本。如果编写如下代码:
double x = calculateArea(3.0);
Java 将查找一个以 double 值作为参数的方法 calculateArea,因此它将使用第一个版本,这个版本将提供的实参视为半径。如果编写如下代码:
double y = calculateArea(1.0, 2.0, 4.0, 6.0);
Java 将使用 calculateArea 的第二个版本,将提供的实参视为两个点的坐标。在这个示例中,第二个版本调用了第一个版本。
很多 Java 方法都是重载的,这意味着它们有不同的版本,但每个版本的形参类型或数量各不相同。例如,print 和 println 都有接受单个参数(任何数据类型均可)的版本;而 Math 类的 abs 方法既有用于 doube 值的版本,也有用于 int 值的版本。
虽然重载是一项很有用的功能,但还是应该慎用。如果在调试方法的一个版本时,不小心调用了另一个版本,你可能会把自己绕进去。
