2016-10-03 97 views
3
public class Test{ 

public static void abc(String s) { 
    System.out.println("String"); 

} 

public static void abc(Object s) { 
    System.out.println("OBject"); 

} 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    abc(null); 

}} 
Output-String 

我是初學者在java中,我很困惑上面的程序的輸出。 請解釋我輸出的原因。爲什麼輸出是「字符串」。意外的輸出

回答

1

Java編譯器選擇最具體的重載方法將被選中。它被稱爲早期綁定。這裏,String extends Object類因此它更具體。你可以參考official Java Language Specification

如果不止一個成員方法既方便和適用於方法調用,就必須選擇一個提供運行時方法調度描述符。 Java編程語言使用選擇最具體方法的規則。

+0

這不是在運行時完成的,而是在編譯時 –

+0

@ErwinBolwidt謝謝,我已經做了更正。 –

8

早期綁定在編譯時結合最具體的方法)。

當您重載方法時,將選擇最具體的方法。在你的情況下,選擇的順序是String>Object(因爲null可以是任何參考類型)。

在層次結構中,String比Object更具體。因此,字符串被選中。事實上對象是在所有的Java中的至少特定對象

這裏是JLS爲同一

http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.12.2.5

如果不止一個成員方法既方便和適用於方法調用,有必要選擇一個爲運行時方法調度提供描述符。 Java編程語言使用選擇最具體方法的規則。

..... [規定]

+0

非常感謝先生。 @suresh ATTA –

0

您使用的概念是超載Object是在Java中的所有類的超類。因此,當你提供任何特定的實現(在本例中爲String)以及一般實現(本例中爲Object)時,JVM默認具有特定實現。 如果你想嘗試一下,請abc(123);

在這種情況下更換abc(null);,輸出將是「對象」爲JVM找不到任何整數具體實施如此這般廣義之一。