2014-12-03 41 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