重載(Overload)和重寫(Override)
方法的重載和重寫都是實ava多態性的不同表現,重載可以理解成多態的具體表現形式,重寫是父類與子類之間多態性的一種表現,區別在於前者實現的是編譯時的多態性,而後者實現的是運行時的多態性。
重載(Overload)
重載發生在一個類中,同名的方法如果有不同的參數列表(參數類型不同、參數個數不同或者二者都不同)則視爲重載;
每個重載的方法(或者構造函數)都必須有一個獨一無二的參數類型列表。
重載規則
- 被重載的方法必須改變參數列表(參數個數或類型或順序不一樣);
- 被重載的方法可以改變返回類型;
- 被重載的方法可以改變訪問修飾符;
- 被重載的方法可以聲明新的或更廣的檢查異常;
- 方法能夠在同一個類中或者在一個子類中被重載。
- 重載對返回類型沒有特殊的要求,無法以返回值類型作爲重載函數的區分標準
- 重載是同樣的一個方法寫多次變量修飾符不一樣,當調用方法時,會自動判斷給入數的類型,選取其中符合的方法。
輸出結果:public class Overloading { private static int i = 5; private static double l = 3.1415; private static String k = "我是小白"; //參數類型不同 public int test(){ System.out.println("我是空參數"); return 1; } public void test(int a){ System.out.println("你輸入了整數:"+a); } public void test(double a){ System.out.println("你輸入了浮點數:"+a); } public void test(String a){ System.out.println("你輸入了字符串:"+a); } //以下兩個參數類型順序不同 public String test(int a,String s){ System.out.println("test3"); return "returntest3"; } public String test(String s,int a){ System.out.println("test4"); return "returntest4"; } public static void main(String[] args){ Overloading lizi = new Overloading(); lizi.test(); lizi.test(i); lizi.test(l); lizi.test(k); System.out.println(lizi.test(1,"test3")); System.out.println(lizi.test("test4",1)); } }
-
我是空參數
你輸入了整數:5
你輸入了浮點數:3.1415
你輸入了字符串:我是小白
test3
returntest3
test4
returntest4
重寫(Override)
重寫發生在子類與父類之間,重寫要求子類被重寫方法與父類被重寫方法有相同的方法名、相同的返回類型,參數列表中,參數的個數、順序、類型必須一樣,比父類被重寫方法更好訪問,不能比父類被重寫方法聲明更多的異常(里氏代換原則)。
使用被重寫的方法時,該方法滿足就近調用的原則
方法的重寫規則
- 參數列表必須完全與被重寫方法的相同;
- 返回類型必須完全與被重寫方法的返回類型相同;
- 訪問權限不能比父類中被重寫的方法的訪問權限更低。例如:如果父類的一個方法被聲明爲public,那麼在子類中重寫該方法就不能聲明爲protected。
- 父類的成員方法只能被它的子類重寫。
- 聲明爲final的方法不能被重寫。
- 聲明爲static的方法不能被重寫,但是能夠被再次聲明。
- 子類和父類在同一個包中,那麼子類可以重寫父類所有方法,除了聲明爲private和final的方法。
- 子類和父類不在同一個包中,那麼子類只能夠重寫父類的聲明爲public和protected的非final方法。
- 重寫的方法能夠拋出任何非強制異常,無論被重寫的方法是否拋出異常。但是,重寫的方法不能拋出新的強制性異常,或者比被重寫方法聲明的更廣泛的強制性異常,反之則可以。
- 構造方法不能被重寫。
- 如果不能繼承一個方法,則不能重寫這個方法。