override 與overload 的區別

逸卿發表於2014-04-13

方法的重寫(Overriding)和過載(Overloading)是Java多型性的不同表現。   
重寫(Overriding)是父類與子類之間多型性的一種表現,而過載(Overloading)是一個類中多型性的一種表現。   
如果在子類中定義某方法與其父類有相同的名稱和引數,我們說該方法被重寫 (Overriding)  。子類的物件使用這個方法時,將呼叫子類中的定義,對它而言,父類中的定義如同被"遮蔽"了.  

如果在一個類中定義了多個同名的方法,它們或有不同的引數個數或有不同的引數型別或有不同的引數次序,則稱為方法的過載(Overloading)。不能通過訪問許可權、返回型別、丟擲的異常進行過載.  


1. Override 特點   
1、覆蓋的方法的標誌必須要和被覆蓋的方法的標誌完全匹配,才能達到覆蓋的效果;   
2、覆蓋的方法的返回值必須和被覆蓋的方法的返回一致;   
3、覆蓋的方法所丟擲的異常必須和被覆蓋方法的所丟擲的異常一致,或者是其子類;   
4、被覆蓋的方法不能為private,否則在其子類中只是新定義了一個方法,並沒有對其進行覆蓋。  


2.Overload 特點   
1、在使用過載時只能通過不同的引數樣式。例如,不同的引數型別,不同的引數個數,不同的引數順序(當然,同一方法內的幾個引數型別必須不一樣,例如可以是fun(int, float), 但是不能為fun(int, int));   
2、不能通過訪問許可權、返回型別、丟擲的異常進行過載;   
3、方法的異常型別和數目不會對過載造成影響;   
4、對於繼承來說,如果某一方法在父類中是訪問許可權是priavte,那麼就不能在子類對其進行過載,如果定義的話,也只是定義了一個新方法,而不會達到過載的效果。  


Overrride例項   
  
class A{   
public int getVal(){   
   return(5);   
}   
}   
class B extends A{   
public int getVal(){   
   return(10);   
}   
}   
public class override {   
public static void main(String[] args) {   
   B b = new B();   
   A a= (A)b;//把 b 強 制轉換成A的型別   
  
   int x=a.getVal();   //列印10,這裡還有一個上轉型的問題(見http://blog.csdn.net/gnuhpc/archive/2009/11/05/4773224.aspx)
   System.out.println(x);   
}   
  
}   
  
Overload例項   
  
package com.guonan;   
//Demostrate method voerloading.   
class OverloadDemo {   
void test(){   
   System.out.println("NO parameters");   
}   
void test(int a){   
   System.out.println("a:"+a);   
}//end of Overload test for one integer parameter.   
void test(int a, int b){   
   System.out.println("a and b:"+a+" "+b);   
     
}   
double test(double a){   
   System.out.println("double a:"+a);   
   return a*a;   
}   
}   
class Overload{   
public static void main(String[] args) {   
   OverloadDemo ob = new OverloadDemo();   
   double result;   
   ob.test();   
   ob.test(10);   
   ob.test(10, 20);   
   result = ob.test(123.25);   
   System.out.println("Result of ob.test(123.25):"+result);   

相關文章