爲什麼輸出是String而不是Object

前邊說了我準備寫一下關於java提高的專欄,要怎麼提高呢,我覺得要想提高還得從問題入手,我想先把從國外網站上別人提問的問題拿到這裏,最後再做一下總結和大家相互探討一下。。 繼前邊我翻譯一道很不錯的字符分割題數組中的跳躍問題之後,今天我有看到一個比較好的問題,如題目所示。。

原文鏈接:http://stackoverflow.com/questions/23563212/why-output-string-passed-not-object

下面來看一下問題吧,先上代碼:

public class test {
public static void main(String[] args) {
    magic(null);
}

public static void magic(String s) {
    System.out.println("String passed");
}

public static void magic(Object o) {
    System.out.println("object passed");
}
}


代碼輸出是爲:

String  Passed

但是這是爲什麼呢,一開始我也很難理解,我感覺編譯都會報錯。

下面先說一下null吧,Java中,null是一個關鍵字,用來標識一個不確定的對象。因此可以將null賦給引用類型變量,但不可以將null賦給基本類型變量。

 比如:int a = null;是錯誤的。Ojbect o = null是正確的,null本身不是對象,也不是Objcet的實例。

null作爲一個不確定的對象,按理來說兩個方法都可以匹配,但是java中有一個規則:優先匹配具體特殊的。

看以下代碼:

public class test {
    public static void main(String[] args) {
        magic(null);
    }

    public static void magic(Object o) {
        System.out.println("object passed");
    }

    public static void magic(String s) {
        System.out.println("String passed");
    }

    public static void magic(Integer s) {
        System.out.println("Integer passed");
    }
}


結果會報錯,錯誤如下:

The method magic(Object) is ambiguous for the type test(就是Integer和String相近,無法選擇)。

歡迎加我的微博, 我會在微博實時更新文章,交流羣:199326422

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