1. 程式人生 > >Java中的Overload(重載)與Override(重寫、覆蓋)

Java中的Overload(重載)與Override(重寫、覆蓋)

tro 子類 數列 AD 屬性。 需要 ide per cati

java中的方法重載發生在同一個類中兩個或者多個方法的方法名相同但是參數不同的情況,方法重載是指子類與父類之間子類重新定義了父類的方法,重寫的方法與原方法簽名、返回值、參數完全相同。
Overload(重載)

  • 重載Overload是一個類中多態性的一種表現,是編譯時的多態性。方法重載是讓類以統一的方式處理不同類型數據的一種手段。重載發生在同一個類中。同名的方法如果有不同的參數列表(參數個數、類型)則視為重載。
  • java方法的重載,就是可以在類中創建多個方法,這些方法具有相同的名字,但具有不同的參數列表。調用方法的時候通過傳遞的參數個數和參數類型的不同來決定具體使用哪個方法,這就是多態性的體現。
  • 重載的時候返回值的類型可以相同也可以不同,無法以返回值的類型來作為重載函數的區分。
  • 不能通過訪問權限來進行重載。

Override(重寫、覆蓋)

  • 子類與父類之間的多態性,對父類的方法進行了重新定義,是運行時的多樣性。如果在子類中定義的某方法與其父類具有相同的名稱和參數,我們說該方法是重寫的方法。在java中,子類可以集成父類的方法而不需要重新編寫相同的方法。但有時子類並不想原封不動的集成父類的方法,而是想做一定的修改,這就需要采用方法的重寫。方法重寫又稱為方法覆蓋。
  • 若子類中的方法與父類中的某一方法具有相同的方法名、參數列表和兼容的返回類型,則新方法將覆蓋原有的方法。如需父類中原有的方法,可以使用super關鍵字,該關鍵字引用了當前類的父類。
  • 子類方法的訪問修飾權限不能少於父類的。

多提一句,C#中重寫時父類的方法必須為虛方法或者抽象方法。
總結:

  • 重寫(覆蓋)的規則:
  • 重寫方法的參數列表必須完全與被重寫的方法的相同,否則不能稱其為重寫而是重載。
  • 重寫方法的訪問修飾符一定要大於被重寫方法的訪問修飾符(public>protected>default>private)
  • 重寫的方法的返回值必須和被重寫的方法的返回一致或者兼容
  • 重寫的方法所拋出的異常必須和被重寫方法的所拋出的異常一致,或者是其子類
  • 被重寫的方法不能為private,否則在其子類中只是新定義了一個方法,並沒有對其進行重寫。
  • 靜態方法不能被重寫為非靜態的方法(會編譯出錯)。
  • 父類方法被final時,無論該方法被public、protected及默認所修飾,子類均不能重寫該方法。

重載的規則:

  • 在使用重載時只能通過相同的方法名、不同的參數形式實現。不同的參數類型可以是不同的參數類型,不同的參數個數,不同的參數順序(參數類型必須不一樣)。
  • 不能通過訪問權限、返回類型、拋出的異常進行重載。
  • 方法的異常類型和數目不會對重載造成影響。

聯系與區別:
方法的重載和重寫都是實現多態的方式,區別在於前者實現的是編譯時的多態性,而後者實現的是運行時的多態性。重載發生在一個類中,同名的方法如果有不同的參數列表(參數類型不同、參數個數不同或者二者都不同)則視為重載;重寫發生在子類與父類之間,重寫要求子類被重寫方法與父類被重寫方法有相同的參數列表,有兼容的返回類型,比父類被重寫方法更好訪問,不能比父類被重寫方法聲明更多的異常(裏氏代換原則)。重載對返回類型沒有特殊的要求,不能根據返回類型進行區分。

隱藏:父類和子類擁有相同名字的屬性或者方法時,父類的同名的屬性或者方法形式上不見了,實際是還是存在的。

  • 當發生隱藏的時候,聲明類型是什麽類,就調用對應類的屬性或者方法,而不會發生動態綁定.
  • 方法隱藏只有一種形式,就是父類和子類存在相同的靜態方法
  • 屬性只能被隱藏,不能被覆蓋。
  • 類實例變量/靜態變量可以隱藏父類的實例/靜態變量。

隱藏與覆蓋的區別:

  • 被隱藏的屬性,在子類被強制轉換成父類後,訪問的是父類中的屬性。
  • 被覆蓋的方法,在子類被強制轉換成父類後,調用的還是子類自身的方法。
  • 因為覆蓋是動態綁定,是受RTTI(run time type identification,運行時類型檢查)約束的,隱藏不受RTTI約束,總結為RTTI只針對覆蓋,不針對隱藏。

Java中的Overload(重載)與Override(重寫、覆蓋)