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;
它是从int
到byte
的Narrowing Conversion 。