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.如果你这样做,在这种情况下,你会得到编译器的错误,因为子的method1不会覆盖任何方法.
编译父类时,编译器会在Parent类中查找method1.它找到它,并发现它是私有的.因为它是私有的,所以它知道它不能被任何子类覆盖,因此静态地将方法调用绑定到它找到的私有方法.
如果method1受到保护或公开,编译器将找到该方法,并知道该方法可以被子类覆盖.所以它不会静态绑定到该方法.相反,它会生成在运行时在具体类中查找method1的字节码,然后您将获得您期望的行为.
想一想:如果子类可以覆盖私有方法,那么该方法将不再是私有的.