JAVA基礎——重載(Overload)和重寫(Override)

重載(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方法。
  • 重寫的方法能夠拋出任何非強制異常,無論被重寫的方法是否拋出異常。但是,重寫的方法不能拋出新的強制性異常,或者比被重寫方法聲明的更廣泛的強制性異常,反之則可以。
  • 構造方法不能被重寫。
  • 如果不能繼承一個方法,則不能重寫這個方法。


發佈了10 篇原創文章 · 獲贊 25 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章