1. 程式人生 > >重載、重寫、方法相同

重載、重寫、方法相同

mage log 自身 包括 新的 png 參數 cnblogs .cn

首先一個方法對外暴露的信息有以下幾個——

權限、是否靜態、是否final、返回類型、方法簽名、異常類型。

其中,按照Effective Java中的約定,方法簽名包括了方法名和參數列表。

重寫指的是父類中的方法無法滿足子類的需求,子類通過重寫一個方法的方式來覆蓋父類的方法。

而重寫方法的某個信息需要與被重寫方法的那個信息一致,才能讓編譯器知道,方法重寫發生了。

那個是信息就是方法簽名子類的方法會去重寫(override)父類中與其方法簽名一致的方法

方法簽名一致,指的是方法名一致且參數類型、個數、類型順序都一致。

技術分享

紅框證明了重寫確實發生了,綠框則表示方法的“是否final”不一致並不影響方法重寫,

並且,參數的變量名(b和a)不一致也不影響方法重寫,因為它們是提供給方法體內部使用的。

但是,尚不能證明 “權限、是否靜態、返回類型、異常類型 需要與被重寫的方法一致才能發生重寫” 是錯誤的,

而實際上,方法重寫確實對上述信息有所限制。

方法重寫還需要遵守一定的限制,否則編譯器會報錯。

1、重寫方法的權限只能比被重寫方法的大,不能比它的小。

技術分享

2、是否靜態需要與被重寫方法一致

技術分享

3、重寫方法可以是final,也可以不是final(被重寫的方法不可能是final的,否則它無法被重寫)

技術分享

4、返回類型需要與被重寫方法一致

技術分享

5、異常類型的捕獲精度只能比被重寫方法的更精確(或是不拋異常),而不能比它的更寬泛

技術分享

綜合以上五點,並不是子類的方法與父類的方法相同時,重寫才會發生,而是在方法簽名相同時便發生了。重寫發生了以後子類方法受到了父類方法的一些限制。

那麽方法簽名不同的方法之間有什麽關系呢?

1、僅僅方法名不同、或是都不同。

  如果兩個方法方法名都不同……那麽他們毫無關系,

  就像Math.asin(double d)和Math.atan(double d)除了方法名不一樣,其他的方法信息都一樣,

  但是它們完全是兩個方法。都不同的情況顯然也是同理。

2、僅僅參數列表不同。

  這種情況下,被稱為方法重載(overload)。

  如果有一個設計良好的方法,那麽他的方法名應該能夠自身作用,

  現在希望這個方法能夠作用在別的參數組合上,而方法作用不變,

  那麽最好的方式應該是再存在一個一樣方法名的方法,但是擁有新的參數列表。

  就像String.valueOf(boolean b)、String.valueOf(int i)……那樣。

重載、重寫、方法相同