您的位置:首页 > 其它

缺陷:“覆盖”私有方法

2009-12-12 21:05 447 查看
今天看到think in java第8章多态,发现段很神奇的代码,有些疑问,标题也是取自书中的这节,主要是我不知道该叫什么。

代码

package privateoverride;

public class PrivateOverride {
private void f(){
System.out.println("private f()");
}

public static void main(String[] args) {
PrivateOverride po = new Derived();
po.f();
}
}

class Derived extends PrivateOverride {
public void f(){
System.out.println("public f()");
}
}


输出为private f()

也就是说是基类的方法被运行了。

我们都知道,在继承的时候,子类不会继承父类的private方法,那意味着,子类拥有的f方法是独立的。

在建立对象的过程中,我们知道,通过父类对象绑定的方法,其实是指向子类的,为什么对象执行f的时候,却依然执行父类的方法??

书上的结论是:只有非private方法才可以被覆盖;但是还需要密切注意覆盖private方法的现象,这时虽然编译器不会报错,但是也不会按照我们所期望的来执行。确切的说,在导出类中,对于基类中的private方法,最好采用不同的名字。

貌似完全没有讲到为什么会这么输出,只是提到了最好要避免这种情况。个人猜测,一旦子类重写了父类的方法(所谓重写,那父类一定不能是private的),动态绑定才能正确地将对象应用于子类本身,而是用private使得编译器无法得知具体绑定的是哪个方法,导致使用默认的顺序从基类输出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: