2013-10-10 89 views
0

任何人都可以解釋下面的代碼的輸出? 嘗試擴展B類中的類A並覆蓋方法goo()和 方法foo()從構造函數中調用。繼承,超級構造函數和私有方法

public class A { 

    public A() { 
     foo(); 
    } 

    private void foo() { // Private function foo() 
     System.out.print("A::foo "); 
     goo(); 
    } 

    public void goo() { 
     System.out.print("A::goo "); 
    } 
} 


public class B extends A { 

    public B() { 
     foo(); 
    } 

    public void foo() { 
     System.out.print("B::foo "); 
    } 

    public void goo() { 
     System.out.print("B::goo "); 
    } 

} 


public class C { 

    public static void main(String[] args) { 
     A b = new B(); 
    } 

} 

輸出:A :: foo的B ::咕B :: foo的

感謝。

+0

'foo()'未被覆蓋。 –

+0

另請參閱http://stackoverflow.com/q/18138397/1679863 –

回答

8

首先,private方法不被繼承。因此A中的foo()B中的foo()不同。

其次,當你調用

A b = new B(); 

B超級構造,因此A的,所以這首先得到

public A() { 
    foo(); // A's version 
} 

private void foo() { // Private function foo() 
    System.out.print("A::foo "); 
    goo(); 
} 

goo()是多態的執行,即執行的隱式調用。 B的實現。

public void goo() { 
    System.out.print("B::goo "); 
} 

然後執行B構造,執行

public B() { 
    foo(); // B's version 
} 

public void foo() { 
    System.out.print("B::foo "); 
} 

要小心時可能從超/父類的構造函數被重寫(直接或間接)調用方法。子對象的狀態可能尚未初始化。