Java 中的 override 和 overload 運算,看這一篇就夠
阿新 • • 發佈:2019-01-07
問題出現:
即使對於一個經驗豐富的開發人員來說,方法過載和方法覆蓋的區別都能讓他猶豫一下,
對於新手來說,經常容易弄混淆。
有沒有比較深入淺出的理解方式,能讓人過目不忘,用起來還能有條件反射般的速度呢?
其他人是怎麼做的:
寫類似比較的部落格非常之多,無非也就是分開介紹,然後比較區別。
好像也有效果,前提是要理解,完了還要不時拿來複習,保持記憶不被遺忘。
可以這樣理解:
override 最準確的翻譯應該是推翻,重寫。 overload 最準確的翻譯應該是過載。 如果你不是新手,看到這個解釋的時候應該有點茅塞頓開的感覺,因為直譯之後的意思就是這兩個方式的功能概括。 所以: override 我喜歡叫做方法重寫; overload 我喜歡叫做方法過載。
分析:
為什麼叫方法重寫: 父類中的方法滿足不了需要,子類可以推翻父類中的方法。 同樣的方法名稱,引數列表,返回型別,丟擲的異常(或者是父類丟擲的異常的子類),子類重寫一個。 所以方法重寫要求很嚴格,除了方法體內部的實現和訪問許可權,其他的都要和父類中需要被重寫的方法保持一致。 有一點要特別注意,方法重寫之後訪問許可權可以不同: 可以擴大訪問許可權,但是不能降低訪問許可權。 可以看作是對子類的相容性和拓展性要求的折衷妥協吧。 注意:被重寫的方法訪問許可權不能為 private,因為 private 修飾的方法子類沒有訪問許可權,更不要提重寫。 為什麼叫方法過載: 過載指的是應對不同的引數列表而產生的方法過載。 所以方法過載要求方法名稱必須相同,引數列表必須不同; 訪問許可權,返回型別,丟擲的異常之類的可以相同也可以不同。 使用方法過載的目的,根據呼叫時的實參表與形參表,來選擇對應的方法體的。 注意:如果某一方法在父類中是訪問許可權是priavte,那麼就不能在子類對其進行過載;如果定義的話,也只是定義了一個新方法,而不會達到過載的效果。
練習一下:
class A { protected int method1(int a, int b) { return 0; } } public class B extends A{ public int method1(int a, int b) { return 0; } // private int method1(int a, int b) { return 0; } // private long method1(int a, int b) { return 0; } public short method1(int a, long b) { return 0; } private int method1(int a, long b) { return 0; } } (參考答案預警!你不打算在心裡演算一下麼?)
參考答案:
class A {
protected int method1(int a, int b) { return 0; }
}
public class B extends A{
public int method1(int a, int b) { return 0; } // 正確,重寫父類方法,可以擴大訪問許可權
// private int method1(int a, int b) { return 0; } // 錯誤,重寫父類方法,不能降低了訪問許可權
// private long method1(int a, int b) { return 0; } // 錯誤,重寫父類方法,不能改變返回值型別
public short method1(int a, long b) { return 0; } // 正確,method1 方法引數過載,可以有不同的訪問許可權和返回值型別
private int method1(int a, long b) { return 0; }/ /正確,method1 方法引數過載,可以有不同的訪問許可權和返回值型別
}
小結:
override 方法重寫,也叫方法覆蓋;
要求被重寫的方法:
名稱相同,
引數列表相同,
返回型別相同,
丟擲的異常相同(或者是父類丟擲的異常的子類)。
被重寫的方法訪問許可權不能為 private。
overload 方法過載;
要求:
方法名稱必須相同;
引數列表必須不同;
訪問許可權,返回型別,丟擲的異常可以相同也可以不同。
傳送門:
本文系筆者原創
轉載請註明出處
—————————————