12.7.4 重载

当方法类型签名、返回值类型和声明的受检异常这三方面的条件都满足之后,子类型中的方法可以覆写父类型中的对应方法。当两个方法的名称相同,但是方法类型签名不满足方法覆写的条件时,这两个方法是不同的重载形式。与覆写不同的是,重载可以发生在同一类型中。在判断是否为重载形式时,只会考虑方法的类型签名,返回值类型和声明的受检异常不在考虑的范围内。如果两个方法的类型签名满足覆写的要求,那么两个方法不可能是重载的关系。如果这两个方法由于返回值类型或声明的异常类型的不兼容造成无法满足覆写的要求,则会产生编译错误。因为在这种情况下,这两个方法既不存在覆写关系,又不存在重载关系。编译器无法确定应该调用哪个方法。

在一个类型中可能包含同一方法的不同重载形式,包括类型中直接定义的及从父类型中继承下来的。对于一个方法调用,可能有多种重载形式都满足要求。比如,对两个重载形式“void method(Object)”和“void method(String)”来说,如果调用的方式是“method("Hello")”,则两种重载形式都是合法的,编译器会选择最合适的重载形式,即“void method(String)”;如果调用的方式是“method(0)”,则只有重载形式void method(Object)”满足要求,编译器直接选择此重载形式。

在某些调用方式下,不同重载形式之间的差别并不明显,不存在一种形式优于另外一种的情况。编译器无法确定该使用哪种形式,会产生编译错误。如果子类型中的方法的目的是覆写父类型中的方法,则应该在子类型中的方法上加上“@Override”注解。添加了“@Override”注解之后,如果该方法并没有正确地覆写父类型中的方法,则会出现编译错误。