
3.7 方法重载

扫码看视频
上面我们为Point类定义的构造方法是没有参数的,考虑到用户可能希望在构造Point对象时,自己来设置点的坐标的初始值,为此,我们为Point类再提供一个带参数的构造方法,如代码3.8所示。

注意代码中粗体显示的部分。
Point类又给出了一个带参数的构造方法,现在Point类共有两个构造方法了,在构造Point类的对象时,如果要调用带参数的构造方法,那么在new关键字后面就要跟带参数的构造方法。
现在Point类有两个同名的构造方法,区别是一个有参数,另一个无参数,这就是方法的重载(Overload)。重载构成的条件是:方法的名称相同,但参数类型或参数个数不同,才能构成方法的重载。Java编译器根据参数的类型和个数来区分不同的重载方法,因此,即使是同名的方法也能很好地区分开。
重载并不是构造方法的特殊待遇,类中的任何方法都可以被重载。下面看一些重载的例子:

第二个method方法和第一个method方法并不构成重载。初次接触重载的读者可能会犯这种错误,方法重载是根据参数类型来区分的,而不是根据参数名称。
注意一下第三个和第四个重载方法,这两个方法是有效的重载方法,编译也不会有问题,但是它可能会给使用者带来一些混淆。
既然重载方法是根据参数类型进行区分的,那么能否根据方法的返回值类型来区分呢?

如果编译器根据方法调用的上下文“double a = method();”来进行分析,那么还是有可能区分这两个方法的。但是如果我们仅仅调用这个方法(例如,程序的一行代码为“method();”),那么编译器就无能为力了。所以可以得出结论:只有方法的返回值类型不同是不能构成方法的重载的。其实,我们只需要记住,方法重载构成的条件只有参数类型或参数个数不同,至于返回值类型是否相同并不需要去考虑,换句话说,返回值类型相同与否并不是方法重载构成的条件。