重載和覆蓋

       override可以翻譯爲覆蓋,從字面就可以知道,它是覆蓋了一個方法並且對其重寫,以求達到不同的作用。對我們來說最熟悉的覆蓋就是對接口方法的實現,在接口中一般只是對方法進行了聲明,而我們在實現時,就需要實現接口聲明的所有方法。除了這個典型的用法以外,我們在繼承中也可能會在子類覆蓋父類中的方法。在覆蓋要注意以下的幾點: 
1、覆蓋的方法的標誌必須要和被覆蓋的方法的標誌完全匹配,才能達到覆蓋的效果; 
2、覆蓋的方法的返回值必須和被覆蓋的方法的返回一致; 
3、覆蓋的方法所拋出的異常必須和被覆蓋方法的所拋出的異常一致,或者是其子類; 
4、被覆蓋的方法不能爲private,否則在其子類中只是新定義了一個方法,並沒有對其進行覆蓋。 
overload對我們來說可能比較熟悉,可以翻譯爲重載,它是指我們可以定義一些名稱相同的方法,通過定義不同的輸入參數來區分這些方法,然後再調用時,VM就會根據不同的參數樣式,來選擇合適的方法執行。在使用重載要注意以下的幾點: 
1、在使用重載時只能通過不同的參數樣式。例如,不同的參數類型,不同的參數個數,不同的參數順序(當然,同一方法內的幾個參數類型必須不一樣,例如可以是fun(int, float), 但是不能爲fun(int, int)); 
2、不能通過訪問權限、返回類型、拋出的異常進行重載; 
3、方法的異常類型和數目不會對重載造成影響; 
4、對於繼承來說,如果某一方法在父類中是訪問權限是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; }//正確,重載自身的方法,可以有不同的訪問權限和返回值類型
}
發佈了21 篇原創文章 · 獲贊 28 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章