2011-03-14 50 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