2014-08-31 50 views
0

的Test3.java:爲什麼超類B調用子類A的方法?

public class Test3 { 
    public static void main(String[] args) { 
     A a = new A(); 
    } 
} 

class A extends B { 

    A() { 
     System.out.println("Now in A()"); 
    } 

    void m() { 
     System.out.println("Now in m() of A"); 
    } 
} 

class B { 
    B() { 
     System.out.println("Now in B()"); 
     m(); 
    } 

    void m() { 
     System.out.println("Now in m() of B"); 
    } 
} 

輸出:

$ java Test3 
Now in B() 
Now in m() of A 
Now in A() 

爲什麼不 「現在在M B的()」 中輸出的第二行?

+1

C++和Java是兩種不同的語言,並且對於多態性的規則略有不同。我建議你閱讀關於繼承性和多態性的書或教程。這個問題已經被多次解答。 – 2014-08-31 01:56:40

+0

@ Code-Apprentice這與C++有什麼關係?此外,如果它已被回答之前,然後將其標記爲重複... – 2014-08-31 02:04:36

+0

@AnubianNoob它與C++做的是,在C++代碼將按照OP期望行事。 – EJP 2014-08-31 02:10:37

回答

3

因爲方法mA中被覆蓋。所以當它進入超級構造函數並調用m時,該對象仍然是A的實例,因此它調用A中的方法。

2

因爲默認情況下Java中的方法是virtual,如果您使用Java 6或更高版本,建議您使用@Override註釋,它使事情更清晰。

的第一個問題是:爲什麼第一行是

Now in B() 

原因是:當你可以在Java擴展類的super constructor通話將自動爲您編譯器完成

A() { 
    super(); // added by Java !! 
    System.out.println("Now in A()"); 
} 

所以,現在我們都在B's constructor

B() { 
    System.out.println("Now in B()"); // print this 
    m(); // Ohh hang on, m() is overridden 
} 

becau se m()被子類A覆蓋,而實際的實例類型爲A,所以我們將調用A的m()實現,這是一個多態的調用。

+1

比我更好地解釋+1。 – 2014-08-31 02:13:02

相關問題