2011-03-14 52 views
3
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()中调用父类method1()而不是Childs method1?我发现只有当method1()是私有的时候才会发生这种情况。有人可以解释我为什么吗?
谢谢你。在Java中混淆​​调用方法

回答

5

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

如果你是Parent定义method1publicprotected和覆盖Child的方法,然后调用method2将调用Childmethod1代替。

+0

为他的示例,可能以及在列表中添加“friendly”。 – kevpie 2011-03-14 00:24:44

+0

@kevpie友好吗? – 2011-03-14 00:25:25

+0

我想他是朋友:)感谢探索马克艾略特 – Kobe 2011-03-14 00:28:22

5

private方法不能被覆盖,因此您在Child上指定的method1未链接。 javac假定您必须是父母上的method1。将其更改为protected将可用。

+1

JLS参考:[8.4.8.1覆盖(通过实例方法)](http://java.sun.com/docs/books/jls/third_edition/html/classes.html#227927) – Paolo 2011-03-14 00:21:53