2016-10-02 75 views
1

爲什麼當對象的類型是子類(OtherClass2)並且測試函數的參數是Person2類型時,以下代碼會生成「in super」輸出?方法不應該調用測試(新的Person2());調用子類的測試函數?Java子類過載不會從超類調用

public class HelloWorld 
{ 
    public static void main(String[] args) 
    { 
    OtherClass2 s = new OtherClass2(); 


    s.goToThing(); 
    } 
} 

public class Person 
{ 

} 

public class Person2 extends Person 
{ 

} 

public class OtherClass 
{ 
    public void hello() 
    { 
    test(new Person2()); 
    } 

    public void test(Person p) 
    { 
    System.out.println("in super"); 
    } 
} 

public class OtherClass2 extends OtherClass 
{ 
    public void test(Person2 g) 
    { 
    System.out.println("In sub"); 
    } 

    public void goToThing() 
    { 
    hello(); 
    } 
} 
+0

重載發生在編譯時;編譯器決定調用'test(Person)',那麼當你的程序運行時,它會檢查子類是否有'test(Person)',否則它不會。 – immibis

回答

1
public void test(Person2 g) 
OtherClass2

不會覆蓋

public void test(Person p) 
OtherClass

。它超載它。但是,它只爲編譯時間類型爲OtherClass2(因爲在編譯時確定超載)的變量重載它。

因此

test(new Person2()); 

調用方法的超類的public void test(Person p),由於OtherClass具有與簽名public void test(Person2 g)(其可能已通過的OtherClass2test方法覆蓋)沒有方法。

如果您在public void test(Person2 g)之上添加了@Override註釋,編譯器會告訴您,此方法不覆蓋超類的任何方法。

1

因爲您的OtherClass2中的測試方法不會覆蓋OtherClass中的測試(它會重載)。 您是否有

public class OtherClass2 extends OtherClass 
{ 
    public void test(Person g) 
    { 
    System.out.println("In sub"); 
    } 

    public void goToThing() 
    { 
    hello(); 
    } 
} 

它會按預期工作。

查看一些進一步的細節和differences between overriding and overloading

0

因爲hello();方法在OtherClass。您撥打goToThing()這是OtherClass2,之後OtherClass2調用hello()方法,其中OtherClass,hello()方法調用test()方法從OtherClass。試試這個:

public class OtherClass2 extends OtherClass 
{ 
    public void hello() 
    { 
     test(new Person2()); 
    } 
    public void test(Person2 g) 
    { 
    System.out.println("In sub"); 
    } 

    public void goToThing() 
    { 
    hello(); 
    } 
}