6.4 重载

你可能注意到了,circleAreacalculateArea 的功能类似,都用于计算圆的面积,只是接受的参数不同:要想调用 calculateArea,必须提供半径,而调用 circleArea 则需要提供两个点的坐标。

如果两个方法所做的事情相同,那么自然应该给它们指定相同的名称。多个方法同名被称为重载(overloading),这在 Java 中是合法的,但前提条件是每个版本接受的参数不同。因此,我们可以将 circleArea 重命名为 calculateArea

  1. public static double calculateArea
  2. (double xc, double yc, double xp, double yp) {
  3. return calculateArea(distance(xc, yc, xp, yp));
  4. }

请注意,这个方法并不是递归方法。当调用重载的方法时,Java 会根据你提供的实参判断要调用的是哪个版本。如果编写如下代码:

  1. double x = calculateArea(3.0);

Java 将查找一个以 double 值作为参数的方法 calculateArea,因此它将使用第一个版本,这个版本将提供的实参视为半径。如果编写如下代码:

  1. double y = calculateArea(1.0, 2.0, 4.0, 6.0);

Java 将使用 calculateArea 的第二个版本,将提供的实参视为两个点的坐标。在这个示例中,第二个版本调用了第一个版本。

很多 Java 方法都是重载的,这意味着它们有不同的版本,但每个版本的形参类型或数量各不相同。例如,printprintln 都有接受单个参数(任何数据类型均可)的版本;而 Math 类的 abs 方法既有用于 doube 值的版本,也有用于 int 值的版本。

虽然重载是一项很有用的功能,但还是应该慎用。如果在调试方法的一个版本时,不小心调用了另一个版本,你可能会把自己绕进去。