2014-12-03 46 views
3

對數字的默認類型如果我寫這樣的事情有沒有在Java中

System.out.println(18); 

哪種類型有「18」? 是int or byte? 或者它還沒有類型?

它不能是int,因爲這樣的事情是正確的:

byte b = 3; 

這是不正確的:

int i = 3; 
byte bb = i; //error! 

編輯: 我想我找到了規範的右部在Assignment Conversion

常量的編譯時間縮小意味着代碼如:

byte theAnswer = 42;

是允許的。如果沒有縮小,那麼整數字面量42具有類型int的事實意味着需要強制轉換爲字節:

byte theAnswer =(byte)42; //鑄造被允許但不要求

+0

很確定它是一個int – user3282276 2014-12-03 03:23:09

+0

在Java規範中仔細地闡述了原始轉換。整數類型將默認爲「int」,但對於縮小和擴大轉換有特定的規則。 https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html – 2014-12-03 03:25:24

+0

感謝您的鏈接,馬特。 – colorblind 2014-12-03 04:56:24

回答

5

18 

已知爲integer literal。有各種literals,浮點,String,性格等

在下面,

byte b = 3; 

字面3是一個整數文字。這也是一個不變的表達。並且由於Java可以確定3適合於byte,因此它可以安全地應用narrowing primitive conversion並將結果存儲在變量byte中。

在這種

int i = 3; 
byte bb = i; //error! 

字面3是常量表達式,但可變i不是。編譯器簡單地決定,由於i不是一個常量表達式,因此不會計算出其值,因此轉換爲byte可能會丟失信息(如何將12345轉換爲byte?),因此不應該被)允許。您可以通過i常數變量

final int i = 3; 
byte bb = i; // no error! 

或通過指定一個明確的轉換

int i = 3; 
byte bb = (byte) i; // no error! 
+0

謝謝,這現在非常有意義。 – colorblind 2014-12-03 04:42:30

1

的整數類型的JLS-4.2.1 - Integral Types and Values

的值是在下面的整數覆蓋此行爲範圍:

  • byte,從-128到127,包容
  • 對於short,從-32768到32767,包容
  • 對於int,從-2147483648到2147483647,包容
  • 對於long,從-9223372036854775808到9223372036854775807,包容性
  • 對於char,從 '\ u0000的' 到 '\ uffff' 包容,即,從0到65535

JLS-3.10.1 - Integer Literals

整數常量的類型爲long,如果後綴爲ASCII字母L或l(ell);否則它是int類型的(§4.2.1)。

最後,JLS-3.10.2 - Floating-Point Literals包括

甲浮點文字的類型爲float如果它與ASCII字母F或f爲後綴;否則它的類型是雙精度型的,它可以選擇性地加上ASCII字母D或d(§4.2.3)。

至於byte b = 3;它是一個從Narrowing Conversionintbyte

+0

感謝您的概述。 – colorblind 2014-12-03 04:55:37