日期:2014-05-20  浏览次数:20609 次

覆盖私有方法?
在书上看到一个例子:

Java code

public class Privateoverride { 
  private void f() { System.out.println("private f()"); }
  public static main(String[] args) {
    PrivateOverride po = new Derived();
    po.f();
  }
}

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





编译后输出的是结果是:private f()
书上的解释是由于基类中的private方法对于导出类是不可见的
但是我不太明白,为什么动态绑定对于这个例子没有起作用?各
位麻烦赐教,不胜感激!

------解决方案--------------------
PrivateOverride po = new Derived();
等效于:
PrivateOverride po =(PrivateOverride)( new Derived());

------解决方案--------------------
如果你基类中的f方法不是private的话,那么 po.f();应该调用的是子类的f方法;
可是你这里把基类的f方法设为private,那么对子类来说是不可见的,所以子类的f方法并不是覆盖基类的f方法,而是另一个f方法,只不过和基类的f名字相同,因为他不知道基类有f方法,所以
基类也不知道子类有f方法,所以在 po.f();时,就会认为子类没有f方法,所以就调用的基类的f方法
------解决方案--------------------
父类的方法是私有的,对子类来说是不可见的,加上2楼的解释,应该可以解释这个问题了吧!
------解决方案--------------------
private方法不会被重写,也就不会有多态
------解决方案--------------------
你这里相当是有两个同名的方法
父类的引用只能引用到属于父类的那个方法
如果想要调用子类的方法 你需要将引用强转成子类的
这里的方法没有重写的关系 故没有多态
------解决方案--------------------
1. 子类的方法的可见性不能大于父类的。
即子类中的 f 方法对于父类来讲,等于没写。
但对于它自己来讲,还是有的。即它有一个super.f() 和this.f()
2. new一个子类对象之后赋给父类是可以的,但这个对象已经是隐含的子类类型。
即 po 虽然表面上是 PrivateOverride ,但实际上它还是 Derived 类型。

综上所述,会打印出父类方法中的结果。

------解决方案--------------------
其实就是在子类重新创建了一个和父类名字相同的新方法,不赞同用override,因为根本不是override,父类的私有方法不可以override