java多態性Overload和Override的區別(面試常考)

最近看了一下關於java的基礎知識,對此作了一下蒐集整理: 

java中的繼承,方法覆蓋(重寫)override與方法的重載overload的區別 

方法的重寫(Overriding)和重載(Overloading)是Java多態性的不同表現。   
重寫(Overriding)是父類與子類之間多態性的一種表現,而重載(Overloading)是一個類中多態性的一種表現。如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫 (Overriding) 。子類的對象使用這個方法時,將調用子類中的定義,對它而言,父類中的定義如同被"屏蔽"了。如果在一個類中定義了多個同名的方法,它們或有不同的參數個數或有不同的參數類型或有不同的參數次序,則稱爲方法的重載(Overloading)。不能通過訪問權限、返回類型、拋出的異常進行重載。 

1. Override 特點   
1、覆蓋的方法的標誌必須要和被覆蓋的方法的標誌完全匹配,才能達到覆蓋的效果;   
2、覆蓋的方法的返回值必須和被覆蓋的方法的返回一致;   
3、覆蓋的方法所拋出的異常必須和被覆蓋方法的所拋出的異常一致,或者是其子類; 
4、方法被定義爲final不能被重寫。  
5、對於繼承來說,如果某一方法在父類中是訪問權限是private,那麼就不能在子類對其進行重寫覆蓋,如果定義的話,也只是定義了一個新方法,而不會達到重寫覆蓋的效果。(通常存在於父類和子類之間。) 


2.Overload 特點   
1、在使用重載時只能通過不同的參數樣式。例如,不同的參數類型,不同的參數個數,不同的參數順序(當然,同一方法內的幾個參數類型必須不一樣,例如可以是fun(int, float), 但是不能爲fun(int, int));   
2、不能通過訪問權限、返回類型、拋出的異常進行重載;   
3、方法的異常類型和數目不會對重載造成影響;   
4、重載事件通常發生在同一個類中,不同方法之間的現象。 
5、存在於同一類中,但是隻有虛方法和抽象方法才能被覆寫。 


其具體實現機制: 

overload是重載,重載是一種參數多態機制,即代碼通過參數的類型或個數不同而實現的多態機制。 是一種靜態的綁定機制(在編譯時已經知道具體執行的是哪個代碼段)。   
    
override是覆蓋。覆蓋是一種動態綁定的多態機制。即在父類和子類中同名元素(如成員函數)有不同 的實現代碼。執行的是哪個代碼是根據運行時實際情況而定的。 

Overrride實例 : 
Java代碼  收藏代碼
  1. class A{     
  2. public int getVal(){     
  3.    return(5);     
  4. }     
  5. }     
  6. class B extends A{     
  7. public int getVal(){     
  8.    return(10);     
  9. }     
  10. }     
  11. public class override {     
  12. public static void main(String[] args) {     
  13.    B b = new B();     
  14.    A a= (A)b;//把 b 強 制轉換成A的類型     
  15.     
  16.    int x=a.getVal();     
  17.    System.out.println(x);     
  18. }     
  19. }   


結果:10 

Overload實例: 
Java代碼  收藏代碼
  1. //Demostrate method voerloading.     
  2. class OverloadDemo {     
  3. void test(){     
  4.    System.out.println("NO parameters");     
  5. }     
  6. void test(int a){     
  7.    System.out.println("a:"+a);     
  8. }//end of Overload test for one integer parameter.     
  9. void test(int a, int b){     
  10.    System.out.println("a and b:"+a+" "+b);     
  11.        
  12. }  
  13. double test(double a){     
  14.    System.out.println("double a:"+a);     
  15.    return a*a;     
  16. }  
  17. }  
  18.     
  19. public class Overload{     
  20. public static void main(String[] args) {     
  21.    OverloadDemo ob = new OverloadDemo();     
  22.    double result;     
  23.    ob.test();     
  24.    ob.test(10);     
  25.    ob.test(1020);     
  26.    result = ob.test(123.25);     
  27.    System.out.println("Result of ob.test(123.25):"+result);  
  28. }  
  29. }  



結果: 

NO parameters 
a:10 
a and b:10 20 
double a:123.25 
Result of ob.test(123.25):15190.5625 
發佈了4 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章