| |
只有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++不允许那样做的原因,所以能够防止产生一些不必要的错误)。
|
|