天天看點

深入解析Java重寫 - 傳回值、修飾符必須一緻?方法的重寫規則Super 關鍵字

重寫是子類對父類的允許通路的方法的實作過程進行重新編寫, 傳回值和形參都不能改變。即外殼不變,核心重寫!

重寫的好處在于子類可以根據需要,定義特定于自己的行為。 也就是說子類能夠根據需要實作父類的方法。

重寫方法不能抛出新的檢查異常或者比被重寫方法申明更加寬泛的異常。例如: 父類的一個方法申明了一個檢查異常 IOException,但是在重寫這個方法的時候不能抛出 Exception 異常,因為 Exception 是 IOException 的父類,隻能抛出 IOException 的子類異常。

在面向對象原則裡,重寫意味着可以重寫任何現有方法。

方法的重寫規則

參數清單必須完全與被重寫方法的相同。

傳回類型與被重寫方法的傳回類型可以不相同,但是必須是父類傳回值的派生類(java5 及更早版本傳回類型要一樣,java7 及更高版本可以不同)。

通路權限不能比父類中被重寫的方法的通路權限更低。例如:如果父類的一個方法被聲明為 public,那麼在子類中重寫該方法就不能聲明為 protected。

父類的成員方法隻能被它的子類重寫。

聲明為 final 的方法不能被重寫。

聲明為 static 的方法不能被重寫,但是能夠被再次聲明。

子類和父類在同一個包中,那麼子類可以重寫父類所有方法,除了聲明為 private 和 final 的方法。

子類和父類不在同一個包中,那麼子類隻能夠重寫父類的聲明為 public 和 protected 的非 final 方法。

重寫的方法能夠抛出任何非強制異常,無論被重寫的方法是否抛出異常。但是,重寫的方法不能抛出新的強制性異常,或者比被重寫方法聲明的更廣泛的強制性異常,反之則可以。

構造方法不能被重寫。

如果不能繼承一個方法,則不能重寫這個方法。

Super 關鍵字

當需要在子類中調用父類的被重寫方法時,要使用 super 關鍵字。

問:java瘋狂講義中說重寫傳回值類型要比父類小,在eclipse中驗證,重寫傳回值類型必須一緻,那麼Java重寫傳回值類型必須一樣嗎?

答:java 5或者以前,必須一樣,java 7 java 8可以不同,但是必須是父類傳回值的派生類。

問:Java重寫要求子類跟父類的修飾符一樣嗎?

答:子類重寫父類的方法的通路修飾符,不能低于父類的方法通路權限;

繼續閱讀