重載、重寫、方法相同
首先一個方法對外暴露的信息有以下幾個——
權限、是否靜態、是否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)……那樣。
重載、重寫、方法相同