java方法重載深層思考

import java.util.ArrayList;
import java.util.List;

public class Demo {
	public static void main(String[] args) {
		x(null);
	}
	public static void x(int x){
		System.out.println("x(int)");
	}
	public static void x(List x){
		System.out.println("x(List)");
	}
	public static void x(ArrayList x){
		System.out.println("x(ArrayList)");
	}
	public static void x(Object x){
		System.out.println("x(Object)");
	}
}

先給段代碼,大家認爲會輸出什麼?

這個當然直接copy到編譯器就直接知道了,是x(ArrayList)

那麼爲什麼呢?

先說說重載的規則:

1.      java編譯器在尋找最精確的匹配的方法,例如,max(3,4)調用的就是max(int ,int);max(3.0,4.0)調用的就是max(double,double);

2.      被重載的方法必須有不同的參數列表。不能基於不同修飾符或返回值類型來重載方法。例如public static int max(int num1,int num2)private static int max   (int num1,intnum2);

       public static double max(int num1,int num2)public static int max(int num1,intnum2)

 

 有時候調用一個方法時,會有兩個或更多匹配的,會造成歧義調用(ambitious invocation)的編譯錯誤。即當編譯器找不到最準確的匹配方法時便會出現這個情況,比如:

public class test{
    public static void main(String[] args){
          System.out.println(max(1,2));
    }
    public static int max(int num1,double num2){
          if(num1>num2)
             return num1;
          else
             return num2;
    }
    public static int max(double num1,int num2){
          if(num1>num2)
             return num1;
          else
             return num2;
    }
} 

 

 


 又比如,如果把這裏
    public static void x(int x){
        System.out.println("x(int)");
    }
改成
    public static void x(Integer x){
        System.out.println("x(int)");
    }
程序就會報錯!
因爲匹配有錯!Integer是引用類型,Integer對象是可以賦值爲null的,這個就和List/ArrayList衝突了
在原來程序裏面,int 是原生類型,Object是基本對象類型,所以,這兩個和List \ ArrayList不衝突,所以,不會報錯!
那麼爲什麼List和ArrayList不衝突呢?
Object ---> List ---> ArrayList是繼承關係。
在英語語法中,有一個有意思的原則,叫:就近原則 , Java的設計者在設計重載函數的衝在順序時,不應該忽視他,因爲這個原則很好的表達了繼承關係。
於是,根據這原則,List和ArrayList不會衝突,並且在這個代碼裏面int無法賦值爲null,所以自然選擇x(ArrayList)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章