方法重載與覆蓋的區別


重載與覆蓋的區別 
1、方法的覆蓋是子類和父類之間的關系,是垂直關系;方法的重載是同一個類中方法之間的關系,是水平關系。 
2、覆蓋只能由一個方法,或只能由一對方法產生關系;方法的重載是多個方法之間的關系。 
3、覆蓋要求參數列表相同;重載要求參數列表不同。 
4、覆蓋關系中,調用那個方法體,是根據對象的類型(對象對應存儲空間類型)來決定;重載關系,是根據調用時的實參表與形參表來選擇方法體的。
 
 
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; }//正確,重載自身的方法,可以有不同的訪問權限和返回值類型
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM