2015-11-30 52 views
-2
public class Test{ 

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

public static void m1(String s){ 
    System.out.println("String called"); 
    } 
} 

現在,這裏是下面的情況下,爪哇:使參數相同的方法簽名以外的參數類型

  • M1( 「串」); 輸出:字符串
  • m1(new String(「string」)); 輸出:字符串調用
  • Object o =「string」; m1(o); 輸出:名爲
  • 的對象
  • Object o = new String(「string」); m1(o); 輸出:名爲
  • 的對象
  • Object o = new Object(); m1(o); 輸出:對象叫做

有人能解釋一下上面的場景嗎?

+1

你的每個變量'o'被定義爲'Object',因此它調用'm1(Object)'。用'String'調用同樣的情況。 – SomeJavaGuy

+0

'Object o =「string」'執行類型擦除,你迫使'String'被認爲是一個通用的'Object'。將'o'傳遞給'm1()'使用對象版本,因爲這是變量'o'的類型。 –

回答

2

的決定是在編譯時間作出的,基於在正在傳遞的表達式的類型。因此,

  • m1("string")使用String版本(因爲文字是String類型)

  • m1(new String("string"))使用String版本,因爲表達式new String("string")是類型的String

  • 所有第您m1(o)者的稀土元素使用Object版本,因爲o類型爲Object(根據聲明)

再次爲重點,具體類型是什麼o指不要緊,它是靜態類型的編譯器使用的表達式來確定調用哪個超載。

這意味着如果你改變了表達的類型,你可以讓編譯器做出了不同的選擇:

Object o = "string"; 
m1((String)o); // Calls the String version 

有專門爲方法調用表達式JLS的整個片:§15.12: Method Invocation Expressions。相關小節是§15.12.2: Compile-Time Step 2: Determine Method Signature

+0

T.J.克羅德謝謝! – BaajiRao

相關問題