Java中的過載和重寫
Java中多型可以體現在方法的過載以及重寫中:
public class Test { public static void main(String[] args) { A a = new B(); test(a); } public static void test(A a){ System.out.println("test A"); a.whoAmI(); } public static void test(B b){ System.out.println("test B"); b.whoAmI(); } } class A{ public void whoAmI(){ System.out.println("I am A"); } } class B extends A{ public void whoAmI(){ System.out.println("I am B"); } }
以上程式碼輸出結果為:
方法的過載可以讓類以統一的方式來處理不同型別的資料,多個同名函式同時存在但是具有不同的引數個數及其型別。
Java中的方法過載,就是在類中可以建立多個方法,它們具有相同的名字,但具有不同的引數和不同的定義。
呼叫方法時通過傳遞給它們的不同引數個數和引數型別來決定具體使用哪個方法,這裡體現的靜態多型性,在編譯時確定引數型別。
方法的重寫即父類和子類間的多型性,在父類的方法不滿足子類時,子類可對其進行重寫,這裡體現的動態多型性,重寫方法只能存在於具有繼承關係中,重寫方法只能重寫父類非私有的方法。被重寫的方法在執行時才會確定資料型別。
重寫方法的規則
1、引數列表必須完全與被重寫的方法相同,否則不能稱其為重寫而是過載。
2、返回的型別必須一直與被重寫的方法的返回型別相同,否則不能稱其為重寫而是過載。
3、訪問修飾符的限制一定要大於被重寫方法的訪問修飾符(public>protected>default>private)
4、重寫方法一定不能丟擲新的檢查異常或者比被重寫方法申明更加寬泛的檢查型異常。例如:
父類的一個方法申明瞭一個檢查異常IOException,在重寫這個方法是就不能丟擲Exception,只能丟擲IOException的子類異常,可以丟擲非檢查異常。
而過載的規則:
1、必須具有不同的引數列表;
2、可以有不責罵的返回型別,只要引數列表不同就可以了;
3、可以有不同的訪問修飾符;
4、可以丟擲不同的異常;
重寫與過載的區別在於:
重寫多型性起作用,對呼叫被過載過的方法可以大大減少程式碼的輸入量,同一個方法名只要往裡面傳遞不同的引數就可以擁有不同的功能或返回值。
用好重寫和過載可以設計一個結構清晰而簡潔的類,可以說重寫和過載在編寫程式碼過程中的作用非同一般.
參考:http://www.cnblogs.com/bluestorm/archive/2012/03/01/2376236.html