Java中的数字是否有默认类型

时间:2014-12-03 03:21:07

标签: java types numbers integer default

如果我写这样的话

System.out.println(18);

哪种类型有' 18'? 是 int 还是 byte ? 或者它还没有类型?

它不能是int,因为这样的事情是正确的:

byte b = 3;

这是不正确的:

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

编辑: 我想我在Assignment Conversion的规范中找到了正确的部分:

  

常量的编译时缩小意味着代码如:

     

字节theAnswer = 42;

     

是允许的。如果没有缩小,整数文字42的类型为int的事实意味着需要转换为字节:

     

byte theAwerwer =(byte)42; //允许施放但不是必需的

2 个答案:

答案 0 :(得分:6)

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可能会丢失信息(如何转换{{ 1}}到12345?)因此不应该被允许。您可以通过使byte成为常量变量

来覆盖此行为
i

或指定明确的演员

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

答案 1 :(得分: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

  

如果整数文字后缀为ASCII字母L或l(ell),则其长度为long;否则它的类型为int(§4.2.1)。

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

  

浮点文字的类型为float,如果后缀为ASCII字母F或f;否则其类型为double,并且可以选择以ASCII字母D或d(§4.2.3)为后缀。

至于byte b = 3;,它是从intbyte的{​​{3}}。

相关问题