在Java中混淆​​调用方法

Adr*_*ian 3 java

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()");        
    }
}
class test {
    public static void main(String args[])
    {
        Parent p = new Child();
        p.method2();
    }
}
Run Code Online (Sandbox Code Playgroud)

我很困惑为什么在Parent :: method2()中调用method1()时它会调用Parents方法1()而不是Childs方法1?我看到只有当method1()是私有的时才会发生这种情况?有人能解释一下为什么吗?
谢谢.

Mel*_*elv 5

private方法无法覆盖,因此method1您指定的Child方法未链接.javac假设你必须指method1父母.改变它将protected工作.


Mar*_*iot 5

这是基于范围规则发生的; 在Parent最佳匹配中method1是类本地私有版本.

如果你定义method1publicprotectedParent和覆盖的方法Child,然后调用method2将调用Childmethod1替代.