2015-11-05 101 views
1

我想測試,如果我有兩個constructors一個有paramsint和其他long。被調用時會執行哪一個?兩個構造函數與int和long參數在同一類

我曾嘗試:

public class OverloadingExample { 
public OverloadingExample(int i, int j) { 
    // TODO Auto-generated constructor stub 
     System.out.println("Hello"+" "+(i+j)); 
} 
public OverloadingExample(long i, long j) { 
    // TODO Auto-generated constructor stub 
    System.out.println("long"+(i+j)); 
} 

public static void main(String[] args) { 
    OverloadingExample duplicacyInHashMap = new OverloadingExample(20, 30); 
    System.out.println(duplicacyInHashMap); 
} 
} 

OUTPUT:

Hello 50 
[email protected] 

相信無論是構造方法調用,因爲params 20,30int以及long類型。那麼第二個構造函數爲什麼不打印「long 50」又有什麼問題。

+1

謝謝澄清。我會擺脫我以前的評論,以避免混淆。在任何情況下,只有一次調用時它不會執行幾個方法/構造函數,它不應該這樣做。這幾乎是一場災難。只有在調用多個方法時才應該執行多個方法。您提供的兩個構造函數都可以被調用_,但只有一個**將被執行。 – Monkeygrinder

回答

1

如果您想要接受兩個long值被稱爲構造函數,則需要在long變量明確地傳遞:

public static void main(String[] args) { 
    OverloadingExample duplicacyInHashMap1 = new OverloadingExample(20, 30); 

    OverloadingExample duplicacyInHashMap2 = new OverloadingExample(20L, 30L); 
} 

輸出:

Hello 50 
long50 

更新:

什麼是更多inte休息是當你在一個int和一個long傳遞會發生什麼:

OverloadingExample duplicacyInHashMap3 = new OverloadingExample(20L, 30); 

在這種情況下,我們得到的輸出long50,這意味着JVM把作爲long價值30。請注意,20L不可能被視爲int,因爲它顯式爲long值(以L結尾),並且投射可能會導致精度損失。

+0

好吧,long構造函數從來沒有執行過,那麼爲什麼它沒有執行兩次int構造函數,而不是在輸出的第二行中給出亂碼 – paul

+1

您只對原始代碼中的構造函數進行了一次調用。 「亂碼」在那裏,因爲你試圖打印一個OverloadingExample對象,並且你永遠不會覆蓋它的'toString()'方法。 –

+0

當你嘗試'System.out.println(duplicacyInHashMap.toString())'它仍然是輸出'你好50 OverloadingExample @ 6d06d69c' – paul

1

這兩個構造函數都適用。如果您刪除第一個,則會使用第二個 - 我們可以將int參數傳遞給long參數。

因爲兩者都適用,所以編譯器選擇最特定的一個。 (int)版本比(long)版本更具體,因爲intlong的子類型。

這確實有點混亂;如果可以的話避免它。

+0

'int'是'long'的子類型嗎? –

+0

@PaulBoddington - 是的,很奇怪 - http://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.10.1 – ZhongYu

+0

謝謝。我不知道。 –

相關問題