我的應用程序具有類似於此的結構:從超類方法調用子類方法?
class Father{
a(){ ... }
b(){a();}
}
class Son extends Father{
a(){ ..... }} //override
B()不overrided。 當我創建一個Son的實例並調用b()時,Father的a()被調用,但我希望它執行Son(如果對象是Son)。可能嗎?
我的應用程序具有類似於此的結構:從超類方法調用子類方法?
class Father{
a(){ ... }
b(){a();}
}
class Son extends Father{
a(){ ..... }} //override
B()不overrided。 當我創建一個Son的實例並調用b()時,Father的a()被調用,但我希望它執行Son(如果對象是Son)。可能嗎?
應該調用兒子的a
方法。如果不是,那麼您要麼不在Son
的實例上運行,要麼您沒有正確覆蓋該方法。如果簽名不完全相同,可能會發生這種情況。我會仔細檢查你的實現,簽名是完全一樣的。此外,請嘗試在a
的Son
實施上方拋出@Override
,看看是否收到編譯錯誤。如果你這樣做,那麼你不是正確地重寫該方法。
像這樣
class Son extends Father{
@Override
a(){ ...}
}
此外,a
必須被保護或者公共的(包私有的,默認的,將只有Father
和Son
是在同一個包工作)。即Son
必須能夠「看見」a()
方法。
謝謝! 'a()'是'private',''protected'它工作:) – supergiox
無/有
的行爲。如果a
不是一個靜態方法,那麼Java使用dynamic binding,所以兒子的a()
方法被調用。
new Son().b()
將在Son中調用方法a()
。這就是所謂的動態綁定。
你有什麼應該是正確的。方法調用被懶惰地綁定。這意味着當您在Son
對象中的任何位置調用方法a()
時,將會調用Son
的方法。
重寫的方法在運行時解析,而重載的方法在編譯時解析。因此,只需調用新的Son().a()就足夠了。
在這種情況下應該調用兒子的a()。 –
@Hovercraft,我假設OP意味着b()沒有被覆蓋,並且他希望b()在子對象是子Son的時候調用a() –
@SamDeHaan:b **不必被覆蓋* * –