1. 程式人生 > >方法過載和方法覆蓋及其異同(Java)

方法過載和方法覆蓋及其異同(Java)

方法過載(Overload)

Java的方法過載,就是在類中可以建立多個方法,它們可以有相同的名字,但必須具有不同的引數,即或者是引數的個數不同,或者是引數的型別不同,又或者是引數的順序不同。呼叫方法時通過傳遞給它們的不同的引數列表來決定具體使用哪個方法。

有時候,類的同一個功能具有多種實現方式,他們的呼叫可能是根據呼叫者提供的引數決定,但是總不可能為每一種實現都取一個易於理解的,恰當的但又彼此不相同的方法名,於是就有了方法過載。特殊的,如果一個類想用多種方式建立物件,那麼它就需要多個不同的構造器,但是構造器名總是類名,所以必須用到方法過載。

過載方法必須滿足的條件:

  • 方法名相同。
  • 方法的引數型別、個數、順序至少有一項不相同。
  • 方法的返回值型別可以不相同。
  • 方法的修飾符可以不相同。

    在一個類中,不允許定義兩個方法名相同,並且引數簽名也完全相同的方法。

方法覆蓋(Override)

在Java中,子類了繼承父類中的方法,但是其方法體卻可能不同,這就需要採用方法的重寫。方法重寫又稱方法覆蓋。

覆蓋方法必須滿足多種約束:

  • 子類方法的名稱、引數簽名和返回值型別必須與父類的一致。

  • 子類方法不能縮小父類方法的訪問許可權。

  • 子類方法不能丟擲比父類方法更多的異常。子類方法丟擲的異常必須和父類方法丟擲的異常相同,或者是子類方法丟擲的異常類是父類方法丟擲的異常類的子類。

  • 父類的非靜態方法不能被子類覆蓋為靜態方法,否則編譯不通過。

方法過載和方法覆蓋的異同

相同點:

  • 都要求方法名相同。

  • 都可以用於抽象方法與非抽象方法之間。

不同點:

  • 方法覆蓋要求引數簽名必須一致,而方法過載要求引數簽名必須不一致。

  • 方法覆蓋要求返回型別必須一致,而方法過載對此不做限制。

  • 方法覆蓋只能用於子類覆蓋父類的方法,方法過載用於同一個類的所有方法(包括從父類中繼承而來的方法)。

  • 方法覆蓋對方法的訪問許可權和丟擲的異常有特殊要求,而方法過載沒有。

  • 父類的一個方法只能被子類覆蓋一次,而一個方法在所在的類中可以被過載多次。