天天看點

方法的覆寫與重載

重載(overload):

        它是指我們可以定義一些名稱相同的方法,通過定義不同的輸入參數來區分這些方法,然後再調用時,VM就會根據不同的參數樣式,來選擇合适的方法執行。在使用重載要注意以下的幾點:

    1、在使用重載時隻能通過不同的參數樣式。例如,不同的參數類型,不同的參數個數,不同的參數順序(當然,同一方法内的幾個參數類型必須不一樣,例如可以是fun(int, float), 但是不能為fun(int, int));

    2、不能通過通路權限、傳回類型、抛出的異常進行重載;

    3、方法的異常類型和數目不會對重載造成影響;

    4、是以子類中的某個方法和父類中繼承下來的方法也可以發生重載的關系。

覆寫 (override):

        從字面就可以知道,它是覆寫了一個方法并且對其重寫,以求達到不同的作用。對我們來說最熟悉的覆寫就是對接口方法的實作,在接口中一般隻是對方法進行了聲明,而我們在實作時,就需要實作接口聲明的所有方法。除了這個典型的用法以外,我們在繼承中也可能會在子類覆寫父類中的方法。在覆寫要注意以下的幾點:

    1、“三同一不低” 子類和父類的方法名稱,參數清單,傳回類型必須完全相同,而且子類方法的通路修飾符的權限不能比父類低;

    2、子類方法不能抛出比父類方法更多的異常。即子類方法所抛出的異常必須和父類方法所抛出的異常一緻,或者是其子類,或者什麼也不抛出;

    3、被覆寫的方法不能為private,否則在其子類中隻是新定義了一個方法,并沒有對其進行覆寫;

    4、被覆寫的方法不能是final類型的。因為final修飾的方法是無法覆寫的;

    5、被覆寫的方法不能為static。是以如果父類中的方法為靜态的,而子類中的方法不是靜态的,但是兩個方法除了這一點外其他都滿足覆寫條件,那麼會發生編譯錯誤。反之亦然。即使父類和子類中的方法都是靜态的,并且滿足覆寫條件,但是仍然不會發生覆寫,因為靜态方法是在編譯的時候把靜态方法和類的引用類型進行比對。

方法的覆寫和重載具有以下相同點:

  • 都要求方法同名
  • 都可以用于抽象方法和非抽象方法之間

方法的覆寫和重載具有以下不同點:

  1. 方法覆寫要求參數清單(參數簽名)必須一緻,而方法重載要求參數清單必須不一緻。
  2. 方法覆寫要求傳回類型必須一緻,方法重載對此沒有要求。
  3. 方法覆寫隻能用于子類覆寫父類的方法,方法重載用于同一個類中的所有方法(包括從父類中繼承而來的方法)。方法的覆寫是子類和父類之間的關系,是垂直關系;方法的重載是同一個類中方法之間的關系,是水準關系。
  4. 方法覆寫對方法的通路權限和抛出的異常有特殊的要求,而方法重載在這方面沒有任何限制。
  5. 父類的一個方法隻能被子類覆寫一次,而一個方法可以在所有的類中可以被重載多次。
  6. 覆寫關系中,調用那個方法體,是根據對象的類型(對象對應存儲空間類型)來決定;重載關系,是根據調用時的實參表與形參表來選擇方法體的。