【本節目标】
通過閱讀本節内容,你将對覆寫有更全面的認識,并了解到覆寫過程中通路控制權限相關的問題與覆寫和重載的差別,能夠分辨覆寫與新定義方法。
方法覆寫限制
雖然利用方法的覆寫可以更好的擴充父類的功能,但是對于覆寫也是有其自身要求的:被覆寫的方法不能夠擁有比父類方法更為嚴格的通路控制權限。
對于通路控制權限現在已經接觸過三種了:public > default (不寫)> private;private權限是最小的,也就是說如果此時父類中的方法使用了default權限定義,那麼子類定義該方法的時候隻能夠使用public或default定義,如果父類中的方法使用了public定義,那麼子類中的方法隻能夠使用public定義。
範例:觀察錯誤的覆寫
class Channel {
public void connect() {
System.out.println(“【Channel父類】進行資源的連接配接。”) ;
}
}
class DatabaseChannel extends Channel { //要進行資料庫的連接配接
void connect() { //保留已有的方法名稱,而後進行覆寫
System.out.println(“【子類】進行資料庫資源的連接配接。”) ;
}
}
public class JavaDemo{
public static void main(String args[]) {
DatabaseChannel channel = new DatabaseChannel () ;
channel.connect() ;
}
}
此時父類的方法使用了public定義,而子類的方法使用了default權限,是以權限更加嚴格了,那麼這種覆寫就是錯誤的了。

圖一 運作結果圖
但是關于權限問題,我們就必須考慮一下private權限,private除了可以定義在屬性上也可以定義在方法上。
class Channel {
private void connect() {
System.out.println(“【Channel父類】進行資源的連接配接。”) ;
}
public void fun() {
this.connect() ; //調用本類方法
}
}
class DatabaseChannel extends Channel { //要進行資料庫的連接配接
//此時并不是覆寫,父類中的connect()方法不可見,那麼這個方法對于子類而言就相當于是一個新定義的方法,與覆寫沒有任何的關系
public void connect() {
System.out.println(“【子類】進行資料庫資源的連接配接。”) ;
}
}
public class JavaDemo{
public static void main(String args[]) {
DatabaseChannel channel = new DatabaseChannel () ;
channel.fun() ;
}
}
執行結果:【Channel父類】進行資源的連接配接。
在以後實際開發之中隻要是定義方法,95%情況下都使用public,是以覆寫的時候最好也考慮public。
面試題:請解釋Override與Overloading差別?Overloading時傳回參數是否相同?
No. | 差別 | Overloading | Override |
---|---|---|---|
1 | 中文含義 | 重載 | 覆寫 |
2 | 概念 | 方法名稱相同,參數的類型及個數不同 | 方法名稱、參數類型及個數、傳回值相同 |
3 | 權限 | 沒有權限限制 | 被覆寫方法不能擁有更嚴格的控制權限 |
4 | 範圍 | 發生在一個類中 | 發生在繼承關系類之中 |
在進行方法重載的時候并沒有對傳回類型做出限制,但是好的習慣應該保持傳回類型的一緻,這樣更加友善處理。
想學習更多的Java的課程嗎?從小白到大神,從入門到精通,更多精彩不容錯過!免費為您提供更多的學習資源。
本内容視訊來源于
阿裡雲大學 下一篇:再生與終結-初識屬性覆寫與final | 帶你學《Java面向對象程式設計》之四十一 更多Java面向對象程式設計文章檢視此處