2017-08-13 46 views
2

我剛剛開始學習java ::繼承和混淆,同時混合上演。爲什麼重寫的方法從子類調用,如果我做了上演?

class Example{ 
    public void methodOne(){ 
     System.out.println("Example::Method_1"); 
    } 

    public void methodTwo(){ 
     System.out.println("Example::Method_2"); 
    } 
} 

public class Test extends Example{ 

    public void methodTwo(){     //Method overriding 
     System.out.println("Test::Method_2"); 
    } 

    public void methodThree(){ 
     System.out.println("Test::Method_3"); 
    } 

    public static void main(String[] args){ 

     Example exa = new Test();    // UpCasting 

     exa.methodOne();      // Printing Example::Method_1 
     exa.methodTwo();      // Printing Test::Method_2 
     // exa.methodThree();     // Error : can not find symbol 
} 
} 

可能有人請解釋,這裏發生了什麼?

+0

你可能想用'@ Override'註釋來標記一個方法正在覆蓋 – baao

+0

我是初學者,所以對於任何錯誤都抱歉,這裏我想知道爲什麼子類方法在調用方法時被調用? –

回答

8

使用繼承時,對調用方法的對象的引用的編譯時類型僅用於查看(在編譯時)是否可以調用該方法。

但是在調用時,編譯時類型是什麼並不重要。在這種情況下真正重要的是對象的運行時類型。它是Test,所以首先在Test上搜索該方法。

對於methodOne()它有點不同:它沒有被覆蓋Test,所以它的超類(Example)的版本被調用。

2

類別Test延伸Example並且在添加新方法methodThree的同時覆蓋methodTwo的實施。現在,在你主

public static void main(String[] args){ 

     Example exa = new Test();    // UpCasting 

     exa.methodOne();      // Printing Example::Method_1 
     exa.methodTwo();      // Printing Test::Method_2 
     // exa.methodThree();     // Error : can not find symbol 
} 

靜態類型變量exa的是在Example類中定義的公共方法界Example因此API的使用,因此它叫exa.methodThree()是非法的(沒有定義它Example)。

雖然對於在Example類定義的方法,運行時會有一個動態綁定,這會導致基於exa變量指向的引用的具體實現。因此,由於動態類型爲Test,因此呼叫會導致執行覆蓋功能。並且由於Test不覆蓋methodOne調用exa.methodOne()將導致由Example定義的實現。

1

如果我們創建子類的對象並使用supper類的引用,那麼運行時時間動態綁定發生在運行時意味着java決定應該調用哪個東西。 在你的情況下: 1. exa.methodOne(); methodOne屬於超類,它不在子類中重寫,所以父類方法將被執行。 這裏如果你創建對象像Test test = new Test();那麼也會給你相同的結果。

  • exa.methodTwo();這裏methodTwo在子類中被重寫,以便在運行時重寫方法將得到粘接並同樣會得到執行。

  • 在第三種情況下,由於您使用父類引用而給出錯誤,但methodThree()不是父項的一部分,所以正在引發編譯錯誤。 如果想調用第三個方法,那麼你可以這樣調用:Test test = new Test();test.methodThree()

  • 僅供參考,

    爲了安全,我們應該經常使用兒童調用方法@Override批註,如果我們想要覆蓋任何父類的方法。這將有助於避免任何方法覆蓋毛刺。

    相關問題