2014-11-03 75 views
1

我在這個網站上發現了以下問題。超載方法

"What happens when we pass int arguments to the overloading method having floatas a parameter for one method and another having double param".

我想我理解的概念,並寫了這個代碼:

public class TestClass { 

    public static void main(String args[]) 
    { 

     TestClass t=new TestClass(); 

     t.sum(1/4); 
    } 
    void sum(double d) 
    { 
     System.out.println("Double==="+d); 
    } 
    void sum(int i) 
    { 
     System.out.println("Integer==="+i); 
    } 
    void sum(short s) 
    { 
     System.out.println("Short==="+d); 
    } 
} 

據我的瞭解這個網站解釋(如上所述),我認爲這將打印Short===0,但令我驚訝的是它打印Integer===0。任何人都可以向我解釋這一點嗎?

回答

0

,它假定他們是int的類型。然後,操作者/將適用的整數除法,並會產生另一個int(這將是0。)

在此之後,該方法具有最具體爲整數參數類型將被調用。在你的情況下,這將是sum(int i)

如果你想調用其他的一些重載方法,你必須明確:

  • 做一個演員。例如,sum((short) (1/4));由於演員表而將調用sum(short s)
  • 指向操作數的類型。例如,sum(1d/4)將調用sum(double d),由於1d/4將導致到double
4

首先,這些都是重載方法,而不是重載方法。

14是整數。因此1/4是一個整數除法,返回0

因此,被調用的方法是sum(int i)

sum(short s)永遠不會被調用一個int參數,因爲這將需要一個narrowing primitive conversion (JLS 5.1.3),這可能會導致數據丟失,並且不允許在method invocation conversion (JLS 5.3)。這種轉換可以通過明確的轉換完成。

如果刪除int版本,則會調用sum(double d),如果刪除雙重版本,則代碼將無法編譯。

爲了調用短版,您必須轉換參數做空:如果你沒有明確告訴編譯器是什麼類型的14

t.sum ((short)(1/4)); 
0

爲整數數目,類型int是默認選擇。因此,雖然1和4可以定義爲intshort,但由於您沒有定義任何內容,因此編譯器將1和4標識爲int,因此它將輸入1/4分度(0)的函數,該函數將參數int