1. 程式人生 > >過載和重寫的區別

過載和重寫的區別

1、方法的重寫(Override)(方法覆蓋)

(1)重寫介紹:

  java SE5增加@Override註解,並不是關鍵字,覆寫某個方法時,新增此註解。@Override可以防止在不想過載時而意外地進行過載。

  1. 父類與之類之間的多型性,對父類的函式進行重新定義。同方法名和同引數;
  2. 子類中的方法與父類中的某一方法具有相同的方法名、返回型別和引數列表,則新方法將覆蓋原有的方法,若需要父類中原有的方法,使用super關鍵字;
  3. 子類函式的訪問修飾符不能小於父類的;(父類為public,則子類不能為protected或者private等,只能是public的)
  4. 子類丟擲異常小於等於父類方法丟擲異常;
  5. 重寫Override,執行時,方法重寫(子類繼承父類並重寫方法)以及物件造型(父引用子型別物件),父子類的多型性表現,是動態分派,指令invokevirtual,在執行期間根據常量池中的類方法的符號引用解析到實際的型別上;

(2)兩同兩小一大原則:

兩同:方法名相同,引數型別相同
兩小:子類返回型別小於等於父類方法返回型別,
   子類丟擲異常小於等於父類方法丟擲異常,
一大:子類訪問許可權大於等於父類方法訪問許可權。

  1. 引數列表必須完全與被重寫方法的相同;
  2. 返回型別必須完全與被重寫方法的返回型別相同;(備註:這條資訊是標準的重寫方法的規則,但是在java 1.5 版本之前返回型別必須一樣,1.5(包含)j 版本之後ava放寬了限制,返回型別必須小於或者等於父類方法的返回型別 )。才有了子類返回型別小於等於父類方法返回型別。在java裡面這個怎麼樣都是正確的,謹記。
  3. 訪問許可權不能比父類中被重寫的方法的訪問許可權更低。例如:如果父類的一個方法被宣告為public,那麼在子類中重寫該方法就不能宣告為protected。否則會有以下資訊:Cannot reduce the visibility of the inherited method from Base
  4. 父類的成員方法只能被它的子類重寫。
  5. 宣告為final的方法不能被重寫。
  6. 宣告為static的方法不能被重寫,但是能夠被再次宣告。(static和final的都不能被重寫)
  7. 子類和父類在同一個包中,那麼子類可以重寫父類所有方法,除了宣告為private和final的方法。
  8. 子類和父類不在同一個包中,那麼子類只能夠重寫父類的宣告為public和protected的非final方法。
  9. 重寫的方法能夠丟擲任何非強制異常,無論被重寫的方法是否丟擲異常。但是,重寫的方法不能丟擲新的強制性異常,或者不能丟擲比被重寫方法宣告的更廣泛的強制性異常,反之則可以。
  10. 構造方法不能被重寫。(構造方法屬於static的)
  11. 如果不能繼承一個方法,則不能重寫這個方法。

2、方法的過載overload

(1)過載介紹

  1. 方法名一樣,但引數型別和個數一樣,返回值型別可以相同也可以不同,無法以返回型別作為過載函式的區分標準;
  2. 方法過載就是在類中建立多個方法,方法名相同,引數列表不同,呼叫方法時通過傳遞給它們的不同引數個數和引數型別來決定具體使用哪個方法,體現多型性;
  3. 方法過載是讓類以統一的方法處理不同型別資料(同方法名,不同引數列表)的一種手段;
  4. 過載overload,編譯時,同一個類中,同名方法有不同引數列表(個數、型別),是一個類中多型性的表現,是靜態分派,在編譯期,通過靜態型別而不是實際型別作為判定依據(靜態方法也可以過載);

(2)構造方法的過載

  【構造方法的過載】:只需要看引數即可,如果想在一個構造方法中呼叫另一個構造方法,那麼可以使用this()的方法呼叫,this()括號中的引數表示目標構造方法的引數,this()必須要作為構造方法的第一跳語句,換句話說,this()之前不能有任何可執行的程式碼。

3、重寫和過載:(多型)

底層實現(靜態分派和動態分派)

  1. 過載overload,編譯時,同一個類中,同名方法有不同引數列表(個數、型別),是一個類中多型性的表現,是靜態分派,在編譯期,通過靜態型別而不是實際型別作為判定依據(靜態方法也可以過載);
  2. 重寫override,執行時,方法重寫(子類繼承父類並重寫方法)以及物件造型(父引用子型別物件),父子類的多型性表現,是動態分派,指令invokevirtual,在執行期間根據常量池中的類方法的符號引用解析到實際的型別上;
    多型
    1.多型性是面向物件程式設計的一種特性,和方法無關;
    2.同樣的一個方法能夠根據輸入資料的不同,做出不同的處理,即方法的過載——有不同的引數列表(靜態多型性);
    3.當子類繼承自父類的相同方法,輸入資料一樣,但要做出有別於父類的響應時,你就要覆蓋父類方法, 即在子類中重寫該方法——相同引數,不同實現(動態多型性);

4、區別總結:

單詞:過載overload,重寫loverride;
形式:過載,方法名相同,引數列表不同(個數、型別、順序);重寫,方法名、返回值、引數列表都相同;
範圍:過載,是編譯時的靜態分派,同一個類中;重寫,執行時動態分派,發生在繼承的父子類中;
許可權:過載,沒有許可權限制;重寫,子類的覆寫的方法許可權不能比父類的訪問許可權小;