天天看點

規則之間-方法覆寫限制 | 帶你學《Java面向對象程式設計》之四十

上一篇:後浪拍前浪-覆寫父類方法 | 帶你學《Java面向對象程式設計》之三十九

【本節目标】

通過閱讀本節内容,你将對覆寫有更全面的認識,并了解到覆寫過程中通路控制權限相關的問題與覆寫和重載的差別,能夠分辨覆寫與新定義方法。

方法覆寫限制

雖然利用方法的覆寫可以更好的擴充父類的功能,但是對于覆寫也是有其自身要求的:被覆寫的方法不能夠擁有比父類方法更為嚴格的通路控制權限。

對于通路控制權限現在已經接觸過三種了: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權限,是以權限更加嚴格了,那麼這種覆寫就是錯誤的了。

規則之間-方法覆寫限制 | 帶你學《Java面向對象程式設計》之四十

圖一 運作結果圖

但是關于權限問題,我們就必須考慮一下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面向對象程式設計文章檢視此處