13.1 数值字面量的下划线表示
从Java 7开始,可以使用下划线对数值进行分隔以提高可读性,如:
int num1 = 123_456_789;
double num2 = 1_234.56_78;
System.out.println(num1);
System.out.println(num2);
上述代码输出的结果是:123456789 和 1234.5678。
可以看到在编译时,编译器会把下划线移除,并把真实的数值赋值给变量。
除了上述示例中要在十进制数据之外,在八进制、十六进制和二进制格式中,也可以使用下划线。没有任何标点符号(例如,用逗号作为千位分隔符)的大数字难以阅读,而在大数字中使用下划线可使其更易于阅读。
下面的示例都是合法的声明:
int num1 = 0x123_456; // 十六进制
int num2 = 0_12345; // 八进制
int num3 = 0b1110_0011_1100; // 二进制
long num4 = 12_3456_7890_0000L; //大数字
注意,下划线只能在两个数字之间,这意味着不能在数字字面值的开头或结尾使用下划线,也不能在十六进制格式的前缀(如 0x)和二进制格式的前缀(如 0b)以及长字面值的后缀(如 L)和浮点字面值的后缀(如 F)中使用下划线。例如以下的写法就不成立:
int num1 = _1234;
int num2 = 1234_;
int num3 = 0x_7B1;
int num4 = 1234_L;
float num5= 1234_.5678;
float num6= 1234._5678;
但是在八进制表示时,可以将整型字面值 1969 以八进制格式写成 03661。在八进制格式的整型字面值中,开头的零被视为数字,而非前缀。在八进制格式的整型字面值中,允许在第一个零之后使用下划线,所以下面的赋值没有语法错误:
int num1 = 0_3661;
13.2 数值类型数据之间的转换
之前介绍的数值类型的取值范围从小到大依次为:byte(1字节)、short(2字节)、int(4字节)、long(8字节)、float (4字节)、double(8字节)
Java支持这些数据类型的互相转换。
Java中类型转换有两种基本方式:
1、把某种类型的值转换成取值范围更广的类型,此时执行的是放大转换(widening conversion)。例如,把 int字面量赋值给 double类型的变量和把字符字面量赋值给 int 类型的变量时,Java 会执行放大转换。
double num1 = 1; //int转换为double
long num2 = 2; //int转换为long
float num3 = 3L; //long转换为float
2、另一种方式是缩小转换(narrowing conversion)。把一个值转换成取值范围没那么广的类型时执行的就是缩小转换。缩小转换并不总是安全的,例如把整数 10转换成 byte 类型是合理的,但把 1000 转换成 byte 类型就不合理,因为 byte类型只能介于 -128 和 127 之间。缩小转换可能丢失数据,所以试图缩小转换时 Java 编译器会发出警告,就算转换后的值能落在更窄的取值范围内也会警告:
byte num4 = 100;
// byte num5 = 1000; 语法错误
如果需要执行缩小转换,而且确信这么做不会丢失数据或精度,可以使用强制类型转换的语法,即在想转换的值前面加一个括号,在括号里写上希望转换成的类型。
int num6 = 10;
byte num7 = (byte) num6; // 把int类型强制转换成byte类型
num6 = (int) 12.345; // 把double字面量强制转换成int类型,得到的是12
下表 列出了各种基本类型能转换成何种其他类型,以及转换的方式。其中带有星号的"自动转换*" 表示自动执行的放大转换,但在转换过程中最低有效位可能丢失。把 int 或 long 类型转换成浮点类型时可能会出现这种情况。浮点类型的取值范围比整数类型广,所以 int 或 long 类型都能用 float 或 double 类型来表示。然而,浮点类型是近似值,所以有效数字不一定总与整数类型一样多。

13.3 小结
本小节主要介绍了数值数据字面量的下划线表示法,主要是提高可读性。同时介绍了Java中基本数据类型之间的互相转换。

被折叠的 条评论
为什么被折叠?



