private函数是不能被重写的,那么子类中定义的f()方法不是和父类中的f()相同

public class Main { public static void main(String args) { new Super().foo(); new Child().foo(); ((Super) new Child()).foo(); } public static class Super { private void foo() { System.out.println("Super.foo()"); } } public static class Child extends Super { private void foo() { System.out.println("Child.foo()"); } }}/* outputSuper.foo()Child.foo()Super.foo()*/public class Main { public static void main(String args) { new Super().foo(); new Child().foo(); ((Super) new Child()).foo(); } public static class Super { public void foo() { System.out.println("Super.foo()"); } } public static class Child extends Super { public void foo() { System.out.println("Child.foo()"); } }}/* outputSuper.foo()Child.foo()Child.foo()*//*至于为什么,我只能说设计如此,而且字节码也是这么生成的。查看生成的字节码对私有方法的调用是invokestatic,对public方法的调用是invokevirtual。invokestatic直接根据名义类型指定了具体方法。*/


    推荐阅读