如果 Java 的基类拥有某个已被多次重载的方法名称,那么在导出类中重新定义该方法名称,
并不会屏蔽其在基类中的任何版本(这一点与 C++不同)。因此,无论是该层或者它的基类
中对方法进行定义,重载机制都可以正常工作:
//:c06:Hide.java
// Overloadinga base-class method name in a derived class
// does nothide the base-class versions.
import com.bruceeckel.simpletest.*;
class Homer {
char doh(char c) {
System.out.println("doh(char)");
return 'd';
}
float doh(float f) {
System.out.println("doh(float)");
return 1.0f;
}
}
class Milhouse {}
class Bart extends Homer {
void doh(Milhouse m) {
System.out.println("doh(Milhouse)");
}
}
public class Hide {
private static Test monitor = new Test();
public static void main(String[] args) {
Bart b = new Bart();
b.doh(1);
b.doh('x');
b.doh(1.0f);
b.doh(new Milhouse());
monitor.expect(new String[] {
"doh(float)",
"doh(char)",
"doh(float)",
"doh(Milhouse)"
});
}
} ///:~
你可以看到,虽然Bart 引入了一个新的重载方法(在 C++中若要完成这项工作是需要屏蔽
基类方法的),但是在 Bart 中 Homer的所有被重载的方法都是可用的。正如你将在下一章所
看到的,使用与基类完全相同的签名(signature)及返回类型来重载具有相同名称的方法,
是一件极其平常的事。但它也令人迷惑不解(这也就是为什么 C++不允许这样做的原因所在
——防止你犯可能会犯的错误)。