2015-12-09 63 views
3
public class NewMain 
{ 
    public static void main(String[] args) 
    { 
     long num = 100; 
     System.out.println(xMethod(5,1000000000000L)); 

    } 

    public static int xMethod(int n, long x) 
    { 
     System.out.println("int, long"); 
     return n; 
    } 

    public static long xMethod(long n, long x) 
    { 
     System.out.println("long, long"); 
     return n; 
    } 

} 

對我來說,這看起來很模糊。如何區分int和long?

一個整數範圍內的數字可以是一個long,用num的聲明來演示。

我很好奇如果我有兩個不同的參數兩種方法會發生什麼。

顯然,在編寫參數時,數字必須在末尾有一個L來表示它很長,而在聲明num時,這不是必需的。 這是爲什麼?

我首先想到,如果它在int範圍內,它會自動將其視爲一個int,並且當它超出該範圍時,它將被用作long。 但是,用我的第二個參數,它不會通過,除非我放置L.它說它不在int的範圍內。

有人可以給這個明確的規則嗎?

回答

3

沒有小數點的數字文字總是被視爲int,除非它有一個以其他方式指定的後綴(如L)。

如果它超出了int的範圍,這是一個編譯錯誤。

聲明NUM時

,這是沒有必要的

您可以將文字到長變量int類型,因爲沒有信息丟失。

+0

我明白了。所以除非有後綴,默認情況下是int? –

+0

並帶有小數點,是默認的雙精度型嗎? –

+0

@JohnDoe是的。類似地,帶浮點的文字(如1.0)是雙精度的。 – Eran

0

您的疑慮是有效的。看看這樣的場景:

public static void methodX(long x, int y){ 

} 
public static void methodX(int x, long y){ 

} 

在這種情況下,如果調用下面的,它會給你不同的結果:

methodX(123, 123); //Compilation error (reference to methodX is ambiguous) 
methodX(123L, 123); //Ok! 
methodX(123, 123L); //Ok! 

第一次調用爲您提供了默認情況下,因爲錯誤不帶後綴(你創建一個整數),它將能夠適應兩種重載方法。


的額外信息

  • 有點無的l後綴,默認整數值將是一個integer
  • 如果沒有d後綴,默認十進制值會一個double
1

引用Java語言規範:

3.10.1. Integer Literals

字面一個整數是long類型的,如果它是與ASCII字母Ll(ELL)後綴; 否則它是int§4.2.1)類型。

後綴L是首選,因爲字母l(ell)通常很難與數字1(一)區分開來。

所以,一個整數是int除非L結束。由於1000000000000是一個int太大,必須末與L,或者你會得到一個編譯錯誤(「int類型的字面1000000000000超出範圍」)

3.10.2. Floating-Point Literals

浮點字面是float類型的,如果它是與ASCII字母Ff後綴; ,否則其類型爲double,它可以選擇性地以ASCII字母Dd§4.2.3)作爲後綴。

因此,除非以f結尾,否則十進制數是double

5.1.2. Widening Primitive Conversion

  • intlongfloat,或double

  • floatdouble

因此,如果需要,編譯器會默認擴展(轉換)int值到long,

就你而言,編譯器更喜歡第一種方法,因爲它可以在沒有任何轉換的情況下被調用。

如果第一個方法不存在,則在將第一個參數隱式轉換爲long後,將調用第二個方法。

0

不帶小數點且不帶後綴的數字文字,如42100始終爲int。要使其成爲long,您必須添加後綴:42L100L

如果您調用方法,參數的實際(編譯時)類型將決定調用哪個重載方法。如果可以使用給定的類型調用多個重載方法,則將採用最具體的方法。 (關於準確的規則,請閱讀JLS的Section 15.2。)因此,在你的情況下,如果第一個參數是int,則將調用第一個方法重載,因爲int更具體,如long

xMethod(1, 1) --> xMethod(int n, long x) is called 
xMethod(1L, 1) --> xMethod(long n, long x) is called 
1

幾個點,我想起了你的問題,
1.聲明一個變量長那麼就沒有必要把L用變量值
2.如果要傳遞一個硬編碼的數字文字,你把L放在最後使其變長,否則所有的數值被視爲int(如果沒有正確的後綴)
3.你可以通過一個int來代替長參數(自動擴展將會發生)
4.你在沒有明確鑄造的情況下不能通過狹窄的類型
5.參數轉換on是通過顯式強制轉換和自動加寬而不考慮數值的大小。

對於下面的代碼示例 - 「內部INT LONG」將被打印由於自動擴大和在不存在private static void aMethod(int a , int b)

public class IntVsLons { 

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

     int a =100; 
     long b=200; 

     aMethod(a,a); 

     } 

    /* 
    private static void aMethod(int a , int b){ 
     System.out.println("Inside INT INT "); 
    } 
    */ 

    private static void aMethod(int a , long b){ 
     System.out.println("Inside INT LONG "); 
    } 

    private static void aMethod(long a, long b){ 
     System.out.println("Inside LONG LONG "); 
    } 

希望它能幫助!