1. 程式人生 > >深入java函數重載

深入java函數重載

html serializa 都是 問題 http spec .html static lis

深入java函數重載


先思考幾個問題:

有這個一個重載的函數:

public static void chongZai1(ArrayList list){
    System.out.println("ArrayList ");
}
public static void chongZai1(AbstractList list){
    System.out.println("AbstractList ");
}

public static void chongZai1(List list){

    System.out.println("List ");
}

1.

 public static void main(String[] args) {
    List list = new ArrayList();
    chongZai1(list);

    ArrayList arrayList = new ArrayList();
    chongZai1(arrayList);
}

會如何輸出?

輸出 :
List
ArrayList


概念:
函數或者方法有同樣的名稱,但是參數列表不相同的情形,這樣的同名不同參數的函數或者方法之間,互相稱之為重載函數或者方法。

  • 函數的重載是一個編譯期概念。
  • 編譯時根據參數變量的類型判斷應該調用哪個方法。

簡單的理解就是

        List list = new ArrayList();
                chongZai1(list);

直接去找 參數為List類型的函數

    ArrayList arrayList = new ArrayList();
    chongZai1(arrayList);

先去找參數類型為 ArrayList 的方法 沒有就去找參數為ArrayList父類的函數 最後才是找參數為Arraylist實現的接口的函數。


如果是這樣重載的函數:

public static void chongZai1(AbstractList list){
    System.out.println("AbstractList ");
}

public static void chongZai1(AbstractCollection list){
    System.out.println("AbstractList ");
}

public static void chongZai1(List list){

    System.out.println("List ");
}
public static void chongZai1(Serializable list){

    System.out.println("List ");
}

 public static void main(String[] args) {

    ArrayList arrayList = new ArrayList();
    chongZai1(arrayList);
}

    這樣編譯期就會拋錯!

    因為它不知道該去掉哪個方法 這些都是父的父類或者實現的接口

    集體規則 參考:[https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2.5](https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2.5)

深入java函數重載