为什么继承输出是意外的

ank*_*hoi 7 java inheritance

class Parent
{
    private void method1()
    {
        System.out.println("Parent's method1()");
    }
    public void method2()
    {
        System.out.println("Parent's method2()");
        method1();
    }
}
class Child extends Parent
{
    public void method1()
    {
        System.out.println("Child's method1()");        
    }

    public static void main(String args[])
    {
        Child p = new Child();
        p.method2();
    }
}
Run Code Online (Sandbox Code Playgroud)

ans是

Parent's method2()
Parent's method1()
Run Code Online (Sandbox Code Playgroud)

如果我正在创建Child类的对象,那么为什么输出是父类方法?即使method1在父级中也是私有的.它动摇了我所有的遗产概念.

JB *_*zet 13

如果它覆盖了父方法,它将调用子方法.但它没有,因为父方法是私有的,因此不能被覆盖.

当您打算从父类或接口覆盖方法时,应始终使用注释方法@Override.如果你这样做,在这种情况下,你会得到编译器的错误,因为子的met​​hod1不会覆盖任何方法.

编译父类时,编译器会在Parent类中查找method1.它找到它,并发现它是私有的.因为它是私有的,所以它知道它不能被任何子类覆盖,因此静态地将方法调用绑定到它找到的私有方法.

如果method1受到保护或公开,编译器将找到该方法,并知道该方法可以被子类覆盖.所以它不会静态绑定到该方法.相反,它会生成在运行时在具体类中查找method1的字节码,然后您将获得您期望的行为.

想一想:如果子类可以覆盖私有方法,那么该方法将不再是私有的.