如果基類中一個方法名被重載多個版本,子類對該方法名的重新定義不會隱藏基類的任何重載版本。無論方法定義在哪一層,重載機制均有效。
public class Hide {
public static void main(String[] args) {
Bart b = new Bart();
b.doh(1); // 調用 doh(float)
b.doh('x'); // 調用 doh(char)
b.doh(1.0f); // 調用 doh(float)
b.doh(new Milhouse()); // 調用 Bart.doh(Milhouse)
}
}
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) { }
}
doh(float) doh(char) doh(float) (無輸出,調用 Bart.doh(Milhouse))
b.doh(1):int 隱式轉 float,匹配 Homer.doh(float)b.doh('x'):精確匹配 Homer.doh(char)b.doh(1.0f):精確匹配 Homer.doh(float)b.doh(new Milhouse()):匹配子類 Bart.doh(Milhouse)父類的重載方法未被子類新增方法遮蔽,體現 Java 重載解析靜態綁定特性:編譯期根據參數靜態類型決定調用哪個重載版本。