Java 類的繼承例項,為什麼輸出這個?

時間 2021-06-06 01:57:20

1樓:adri1

宣告M h = new H();

C c = new H();

呼叫c.f(h);

h.g(c);

返回in M.f

in H.g

c的型別是C,傳入引數型別是M

所以呼叫的方法是 M中定義的f(M m),返回 M.fh的型別是M,傳入引數型別是C

因為M沒有g(C c)的方法,只有過載到g(M m)由於不知道是bug還是什麼原因,你在H中重寫了g(M)方法,所以返回了H裡定義的H.g

2樓:Sin Jackal

Override的時候加上

@Override

一旦發生問題,可以compile time 發現問題,在你的case中很方便

3樓:劉文俊

首先吐槽一下命名,c f h m 什麼的,人肉混淆嗎。。。

然後解釋一下在繼承中重寫父類方法的要求:

引數:引數個數和型別必須完全與父類中的方法相同返回值:在 JDK5 以前,返回值必須與父類中的方法相同;在 JDK6 以後,也可以是父類方法返回值的子型別,此特性稱為方法返回值協變

異常:方法宣告丟擲的受檢異常型別必須與父類方法中的相同或為其協變型別如果不滿足上述三個條件,則不是重寫父類方法,而是在子類中新增了乙個全新的方法。

最佳實踐是在子類重寫的方法中新增 @Override 註解,加上此註解後,如果方法沒有重寫成功,則會丟擲編譯錯誤,幫助你提前發現。

有關Java中類的繼承中方法繼承的問題?

Intopass 對於非靜態方法,有幾種呼叫方法。staticMethod this.staticMethod instance.staticMethod ClassName.staticMethod 強烈建議只使用第一種直接呼叫和第四種通過類名呼叫的方法。並且將第一種方法等同於第四種方法,並理解對...

Java的多型為何可以由子類例項化父類?

胖不起來 程式最終執行,取決於你new的是誰,型別只是一種約束,比如,父類有乙個 a 方法,子類重寫了a,並且增加了 b 方法,假如定義是這樣 Father f new son 在記憶體中實際存在的是son的例項,那是不是可以呼叫 a 和 b 了呢,不是的,這時候 Father型別就起約束作用了,使...

java中子類有沒有繼承父類的私有變數?

atlanc 確實是繼承了,但是父類臨終前對子類說,這筆遺產,你不能亂動,只能用我的非private方法來動。也就是說,父類的private屬性都會遺傳給子類,但是子類只能沿襲父類的生活習慣來使用這些屬性。 肖遙 我看到官方文件說不能繼承私有成員的時候也懵了。標準答案是 不能繼承 但是這裡的處理是很...