深入java函數重載
阿新 • • 發佈:2018-07-13
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函數重載