1. 程式人生 > >Java 中的 override 和 overload,看這一篇就夠

Java 中的 override 和 overload,看這一篇就夠

urn 兼容性 return com 容易 定義 erl ext class

問題出現:

即使對於一個經驗豐富的開發人員來說,方法重載和方法覆蓋的區別都能讓他猶豫一下,
對於新手來說,經常容易弄混淆。
有沒有比較深入淺出的理解方式,能讓人過目不忘,用起來還能有條件反射般的速度呢?

其他人是怎麽做的:

寫類似比較的博客非常之多,無非也就是分開介紹,然後比較區別。
好像也有效果,前提是要理解,完了還要不時拿來復習,保持記憶不被遺忘。

可以這樣理解:

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/13508140/2339876
本文系筆者原創
轉載請註明出處
—————————————

Java 中的 override 和 overload,看這一篇就夠