缺陷:“覆盖”私有方法

今天看到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使得编译器无法得知具体绑定的是哪个方法,导致使用默认的顺序从基类输出。

posted @ 2009-12-12 21:05  雪霁霜飞  阅读(351)  评论(0编辑  收藏  举报