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()

解决方案 »

  1.   

    PrivateOverride po = new Derived();java的多态,父类引用指向子类引用。
    po.f();实际上调用的还是 private void f() 这个方法,所以输出的是:private f()。
      

  2.   

    po实例化对象是Derived类型,po调用f()方法Derived中存在使用Derived的不存在则掉用Derived的父类PrivateOverride f()方法,细节看think in java
      

  3.   

    你调用的其实还是private void f() { System.out.println("private f()"); 
      

  4.   

    private void f() { System.out.println("private f()"); }
    f()为私有, 只允许内部访问。实际上执行的是父类的private  f() 
      

  5.   

    跟 main 方法所在的位置有关系.  你把main方法移到Derived 这个类里看看就能理解了.
      

  6.   

    因为子类没有覆盖父类的 私有 f(),而是继承了..
    PrivateOverride  对象 肯定会把自己的打印出来
      

  7.   

    private 方法是不能被override的。PrivateOverride po = new Derived();
      po.f();
    如此声明po;调用f()方法时,会先看子类中有没有override的方法,有就调用,没有就调用父类的。而因为f()方法是privte的,所以根本不用去看子类中有没override的方法  它本就是不可覆盖的
      

  8.   

    我看tij中也没有深刻地深入这个问题,虽然private方法相当于final,子类同签名方法实际未覆盖父类方法,在调用方法时自然没有发生多态。这可能和多态触发的前提条件有关,它就规定了未覆盖的不能多态,实际上po对象中不能说没有含有子类f方法的信息吧
      

  9.   

    如果方法是private、static、final或者构造器,编译器就可以确定调用那个方法。这是静态绑定。如果不是上述情况,就要使用运行时(动态)绑定。在程序运行时,采用动态绑定意味着:虚拟机将调用对象实际类型所限定的方法。换句话说,它不能按照引用的类型来决定将要调用的方法,而必须根据对象的实际类。
      

  10.   

    因为用声明的是父类的,而new创建的是子类对象,在调用时看new后面的是是子类还是父类。
      

  11.   

    主要原因是:f()方法未被重写,父类中为private f()