問題出現:
即使對於一個經驗豐富的開發人員來說,方法過載和方法覆蓋的區別都能讓他猶豫一下,
對於新手來說,經常容易弄混淆。
有沒有比較深入淺出的理解方式,能讓人過目不忘,用起來還能有條件反射般的速度呢?
其他人是怎麼做的:
寫類似比較的部落格非常之多,無非也就是分開介紹,然後比較區別。
好像也有效果,前提是要理解,完了還要不時拿來複習,保持記憶不被遺忘。
可以這樣理解:
override 更準確的翻譯應該是推翻,重寫。
overload 更準確的翻譯應該是過載。
如果你不是新手,看到這個解釋的時候應該有點茅塞頓開的感覺,
因為直譯之後的意思就是這兩個方式的功能概括。
所以:
override 個人喜歡叫做方法重寫;
overload 個人喜歡叫做方法過載。
分析:
為什麼叫方法重寫:
父類中的方法滿足不了需要,子類可以推翻父類中的方法。
同樣的方法名稱,引數列表,返回型別,丟擲的異常(或者是父類丟擲的異常的子類),子類重寫一個。
所以方法重寫要求很嚴格,除了方法體內部的實現和訪問許可權,其他的都要和父類中需要被重寫的方法保持一致。
有一點要特別注意,方法重寫之後訪問許可權可以不同:
可以擴大訪問許可權,但是不能降低訪問許可權。
可以看作是對子類的相容性和擴充性要求的折衷妥協吧。
注意:被重寫的方法訪問許可權不能為 private,因為 private 修飾的方法子類沒有訪問許可權,更不要提重寫。
為什麼叫方法過載:
過載指的是應對不同的引數列表而產生的方法過載。
所以方法過載要求方法名稱必須相同,引數列表必須不同;
訪問許可權,返回型別,丟擲的異常之類的可以相同也可以不同。
使用方法過載的目的,根據呼叫時的實參表與形參表,來選擇對應的方法體的。
注意:如果某一方法在父類中是訪問許可權是 private,那麼就不能在子類對其進行過載;
如果定義的話,也只是定義了一個新方法,而不會達到過載的效果。
練習一下:
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 方法過載;
要求過載的方法:
方法名稱必須相同;
引數列表必須不同;
訪問許可權,返回型別,丟擲的異常可以相同也可以不同。
傳送門:http://blog.51cto.com/1350814…
本文系筆者原創
轉載請註明出處
—————————————