問題出現:
即便對於一個經驗豐富的開發人員來講,方法重載和方法覆蓋的區別都能讓他猶豫一下, 對於新手來講,常常容易弄混淆。 有沒有比較深刻淺出的理解方式,能讓人過目不忘,用起來還能有條件反射般的速度呢?
其餘人是怎麼作的:
寫相似比較的博客很是之多,無非也就是分開介紹,而後比較區別。 好像也有效果,前提是要理解,完了還要不時拿來複習,保持記憶不被遺忘。
能夠這樣理解:
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...
本文系筆者原創
轉載請註明出處
—————————————ide