2011-08-10 101 views
3

我的應用程序具有類似於此的結構:從超類方法調用子類方法?

class Father{ 
a(){ ... } 

b(){a();} 
} 

class Son extends Father{ 
a(){ ..... }} //override 

B()不overrided。 當我創建一個Son的實例並調用b()時,Father的a()被調用,但我希望它執行Son(如果對象是Son)。可能嗎?

+0

在這種情況下應該調用兒子的a()。 –

+0

@Hovercraft,我假設OP意味着b()沒有被覆蓋,並且他希望b()在子對象是子Son的時候調用a() –

+0

@SamDeHaan:b **不必被覆蓋* * –

回答

4

應該調用兒子的a方法。如果不是,那麼您要麼不在Son的實例上運行,要麼您沒有正確覆蓋該方法。如果簽名不完全相同,可能會發生這種情況。我會仔細檢查你的實現,簽名是完全一樣的。此外,請嘗試在aSon實施上方拋出@Override,看看是否收到編譯錯誤。如果你這樣做,那麼你不是正確地重寫該方法。

像這樣

class Son extends Father{ 
    @Override 
    a(){ ...} 
} 

此外,a必須被保護或者公共的(包私有的,默認的,將只有FatherSon是在同一個包工作)。即Son必須能夠「看見」a()方法。

+0

謝謝! 'a()'是'private',''protected'它工作:) – supergiox

5

無/有

  • 沒有:「當我創造的兒子的一個實例,我稱之爲B(),父親的一個()被調用時,」這是不對的!
  • 是的:「但是我希望它執行一個兒子(如果對象是一個兒子),可能嗎?」 - 這就是Java

的行爲。如果a不是一個靜態方法,那麼Java使用dynamic binding,所以兒子的a()方法被調用。

new Son().b()將在Son中調用方法a()。這就是所謂的動態綁定。

-1

你有什麼應該是正確的。方法調用被懶惰地綁定。這意味着當您在Son對象中的任何位置調用方法a()時,將會調用Son的方法。

-1

重寫的方法在運行時解析,而重載的方法在編譯時解析。因此,只需調用新的Son().a()就足夠了。