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()"); }
}
public class Test {
public static void main(String[] args) {
PrivateOverride.main(args);
}
}
这个程序的输出是:private f()
,我个人理解的原因如下:
1.父类中的private方法、属性对于子类是不可见的,因此也就谈不上什么重写覆盖这些。在重写这个概念中,子类不想要父类方法达到的效果或值,就会去修改,或者覆盖这个方法。如果方法不可见,那子类就不会产生修改父类方法的念头,所以父类中的private方法也就谈不上重写了。
2.再来看看形成动多态的条件:
1)继承
2)继承中必须有方法覆盖
3)必须由父类的引用指向派生类的实例,并且通过父类的引用调用被覆盖的方法
3.可以发现,我们这个例子中的子类和父类并没有满足条件2)。而且原来父类就是通过方法覆盖知道子类修改了自己的方法,现在子类没有重写父类方法,那么子类其实是相当于写了一个f()
方法,它只是恰好名字和父类的方法同名一样而已。现在向上转型,我们来联想一下,向上转型后,父类只有被重写后的方法内容和原来的不一样而已,属性、静态方法都一样,也就是说,向上转型后,我们得到的是一个非静态非private方法被修改了,其余部分都没变的父类。这个例子中并没有发生重写,所以所谓的向上转型,其实得到的还是一个原封不动的基类。