在Java中混淆​​调用方法

时间:2011-03-14 00:06:18

标签: 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();
    }
}

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

2 个答案:

答案 0 :(得分:5)

无法覆盖

private个方法,因此您在method1上指定的Child未链接。 javac假设您必须表示父级method1。将其更改为protected即可。

答案 1 :(得分:5)

根据范围规则发生这种情况;在Parent中,method1的最佳匹配是类本地私有版本。

如果您要在method1中将public定义为protectedParent并覆盖Child中的方法,则会调用method2改为调用Child的{​​{1}}。