只有C++程序員可能才會驚訝於名字的隱藏,因為它的工作原理與在C++裡是完全不同的。如果Java基礎類有一個方法名被“過載”使用多次,在衍生類裡對那個方法名的重新定義就不會隱藏任何基礎類的版本。所以無論方法在這一級還是在一個基礎類中定義,過載都會生效:
//: Hide.java // Overloading a base-class method name // in a derived class does not hide the // base-class versions 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) {} } class Hide { public static void main(String[] args) { Bart b = new Bart(); b.doh(1); // doh(float) used b.doh('x'); b.doh(1.0f); b.doh(new Milhouse()); } } ///:~
正如下一章會講到的那樣,很少會用與基礎類裡完全一致的簽名和返回類型來覆蓋同名的方法,否則會使人感到迷惑(這正是C++不允許那樣做的原因,所以能夠防止產生一些不必要的錯誤)。