3.7 深入分析字面值
在第2章已经简要提及了字面值。前面已经正式描述了内置类型,接下来深入分析字面值。
3.7.1 整型字面值
在典型的程序中,整型可能是最常用的类型。所有数字都是整型字面值,例如1、2、3和42。这些都是十进制数字,表示它们是以10为基数描述的。在整型字面值中,还可以使用另外两种进制——八进制(以8为基数)和十六进制(以16为基数)。在Java中,八进制数值以0开头。常规的十进制数字不以0开头。因此,对于看似有效的值09,编译器会产生一个错误,因为9超出了八进制数字0~7的范围。程序员针对数字更常使用的是十六进制,以便整齐地匹配以8为模的字的尺寸,如8位、16位、32位和64位。以0x或0X开头来标识十六进制常量。十六进制数字的范围是0~15,因此分别用A~F(或a~f)替代数字10~15。
整型字面值用于创建int类型数值,在Java中是32位的整数。既然Java是强类型化的,您可能会好奇Java如何将整型字面值赋给其他整数类型,如byte或long,而不会导致类型不匹配错误?幸运的是这种情况很容易处理。当将字面值赋给byte或short变量时,如果字面值位于目标类型的范围之内,就不会产生错误。整型字面值总是可以赋给long变量。然而,为了标识long字面值,需要明确告诉编译器字面值是long类型的。可以通过为字面值附加一个大写或小写的L来明确地标识其类型为long,例如0x7ffffffffffffffL或9223372036854775807L是最大的long类型的字面值。也可以将整数赋给char,只要在char类型的范围之内即可。
从JDK 7开始,可以使用二进制指定整型字面值。为此,使用0b或0B作为数值的前缀。例如,下面这行代码使用二进制字面值指定十进制值10:
- int x = 0b1010;
除了其他用途之外,二进制字面值简化了用作位屏蔽的数值的输入。对于这种情况,十进制(或十六进制)表示的数值不能很直观地表达出与其用途相关的含义,而二进制字面值却可以。
从JDK 7开始,在整型字面值中还可以嵌入一个或多个下划线。嵌入下划线可以使阅读很大的整数变得更加容易。当编译字面值时,会丢弃下划线。例如,下面这行代码:
为x提供的值为123 456 789,下划线将被忽略。下划线只能用于分隔数字,不能位于字面值的开头和结尾。然而,在两个数字之间使用多个下划线是允许的。例如,下面这行代码是合法的:
- int x = 123_456_789;
当编码电话号码、消费者ID号、护照号码等事物时,在整型字面值中使用下划线特别有用。当指定二进制字面值时,下划线对于提供视觉分组也是有用的。例如,二进制数值经常以4位进行视觉分组,如下所示:
- int x = 123___456___789;
- int x = 0b1101_0101_0001_1010;