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

如果我写这样的东西

System.out.println(18); 

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

它不能是int,因为这样的东西是正确的:

 byte b = 3; 

这是不正确的:

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

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

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

byte theAnswer = 42;

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

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

这个

 18 

被称为整数文字 。 有各种各样的文字 ,浮点, String ,字符等。

在下面的,

 byte b = 3; 

文字3是整数文字。 它也是一个不变的表达。 由于Java可以判断3适合一个byte ,因此可以安全地应用缩小的原语转换并将结果存储在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! 

JLS-4.2.1 – 积分类型和值

整数类型的值是以下范围内的整数:

  • 对于byte ,从-128到127(含)
  • short ,从-32768到32767,包括在内
  • 对于int ,从-2147483648到2147483647,包括在内
  • long ,从-9223372036854775808到9223372036854775807,包括
  • 对于char ,从’\ u0000’到’\ uffff’包含,即从0到65535

和JLS-3.10.1 – 整数文字

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

最后, JLS-3.10.2 – 浮点文字包括

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

至于byte b = 3; 它是从intbyte的Narrowing Conversion 。