2013-05-06 66 views
0

我想讓我的頭在java中的動態方法調用,並不能夠理解爲什麼java不讓我調用方法從子類而不是超類的方法。在Java中的動態方法查找

例如: 如果我有2類TestTest2。 Test2的繼承從類測試

的方法someFunction()在子類覆蓋:

測試類

public class Test { 

    public Test(){ 
     System.out.println("I am Test class constructor called with no values"); 
    } 

    public void someFunction(){ 
     System.out.println("I am some function belonging to Test Class"); 
    } 
    } 

和TEST2類:

public class Test2 extends Test{ 

    public Test2(){ 
     System.out.println("Constructor of Test2 with no values"); 
    } 

    public void somFunction(){ 
     System.out.println("I am someFunction overridden in Test2"); 
    } 
} 

所以當我試着 實例化測試類以這樣的方式

Test t1 = new Test2(); 
    t1.someFunction(); // this should call Test2.someFunction() 

我得到的輸出是:

I am Test class constructor called with no values 
Constructor of Test2 with no values 
I am some function belonging to Test Class 

所以我的問題是: 當我打電話使用object t1爲什麼它調用該方法屬於方法someFunction()即使在我用子類初始化對象時,超類代替了子類中的那個。
我一直認爲動態調用用來以這種方式工作,即你初始化對象的類,這個類的方法被稱爲基本重寫的方法,而不是父方法。

Dinesh

回答

7

Typo。

public void somFunction(){

應該

public void someFunction(){

由於leonbloy在評論中說,如果你的方法之前放置註解@Override,編譯器將編譯時檢查,它實際上覆蓋的東西。所以,如果它的方法名是一個錯字(或者,如果該方法將覆蓋變化的簽名),它不會編譯:

@Override public void somFunction(){ //compile time error 
+5

要避免這種錯誤,請使用@Override註釋 – leonbloy 2013-05-06 01:19:30

0

你有一個錯字錯誤(somFunction而不是someFunciton)在類的Test2,你有沒有覆蓋函數而不是你有新的函數somFunction。