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

bour發表於2019-01-19

問題出現:

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

其他人是怎麼做的:

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

可以這樣理解:

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

相關文章