Java 为什么继承输出是意外的

Java 为什么继承输出是意外的,java,inheritance,Java,Inheritance,ans是 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 {

ans是

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();
    }
}
若我正在创建子类的对象,那个么为什么输出是父类方法的呢?? 即使method1在父级中也是私有的。
它动摇了我的所有继承概念。

私有成员不是由子类继承的。因此,您只需在子类中定义一个完全独立的
public void method1
。当然,它不参与动态分派。

如果它重写父方法,它将调用子方法。但它不是,因为父方法是私有的,因此不能被重写

当您打算从父类或接口重写方法时,应始终使用
@override
注释该方法。如果您这样做了,在本例中,您将从编译器中得到一个错误,因为子级的method1不会重写任何方法

编译父类时,编译器会在父类中查找method1。它找到了它,并发现它是私人的。由于它是私有的,它知道它不能被任何子类重写,因此静态地将方法调用绑定到它找到的私有方法

如果method1是受保护的或公共的,编译器将找到该方法,并且知道该方法可以被子类重写。因此它不会静态绑定到该方法。相反,它将生成字节码,在运行时在具体类中查找method1,然后您将获得预期的行为


想想看:如果子类可以重写私有方法,那么该方法就不再是私有的。

默认情况下,子类将有权访问父方法。您正在调用p.method2()。。。它在子类中不存在,因此正在从父类执行


虽然method1()是私有的,但它是父级。。正在从本地方法(即method2()调用它。。。因此method1()在method2()中具有可访问性…

@ankitagahoi我看不出语句中“but”的意义:)如果这是子类对象,并且子类具有method1,那么它就不是重写的情况。Child p=新的Child();现在我在不同的包中创建了Child,并在Parent中设置method1默认值,现在仍然是相同的输出。但按照您的说法,它在编译时绑定,但默认值不应该在编译时绑定,它应该被覆盖。y相同的输出?默认方法不能被其他包中的类重写,因此您仍然没有重写父方法。添加@Override注释,您将得到一条编译器消息。但在编译时,编译器如何知道类在不同的包中扩展?
Parent's method2()
Parent's method1()