本节书摘来异步社区《Java和Android开发学习指南(第2版)》一书中的第2章,第2.6节,作者:【加】Budi Kurniawan,更多章节内容可以访问云栖社区“异步社区”公众号查看。
2.6 字面值
很多时候,我们需要给程序中的变量赋值,例如,将数字2赋给一个int型变量,或者将字符“c”赋给一个char型变量。为此,需要按照Java编译器能够理解的格式来书写值的表示形式。表示一个值的源代码叫作字面值。有3种类型的字面值:基本类型的字面值、字符串字面值和空字面值。本章只介绍基本类型的字面值。第4章将介绍空字面值,第5章将介绍字符串字面值。
基本类型的字面值有4种子类型:整数字面值、浮点数字面值、字符字面值和布尔字面值。下面分别介绍这些子类型。
2.6.1 整数字面值
整数字面值可以写为十进制(以10为基数,这是我们所习惯使用的)、十六进制(以16为基数)和八进制(以8为基数)。例如,100可以表示为100。如下的整数字面值都是十进制的:
2
123456
作为另一个示例,如下的代码将10赋值给int类型变量x。
int x = 10;
使用前缀0x或0X表示十六进制的整数。例如,十六进制的数字9E写作0X9E或0x9E。八进制的整数使用数字0作为前缀。例如,如下是八进制的数字567:
0567
整数字面值用于将值赋给byte、short、int和long类型的变量。请注意,我们所赋值的值不能超出了一个变量的存储范围。例如,一个byte的最大的值是127。因此,如下的代码将会产生一个编译错误,因为200对于byte类型来说太大了。
byte b = 200;```
要将一个值赋给long类型,在数字的后面带上一个字母L或l作为后缀。L是首选,因为它很容易和数字1区分开来。一个long类型,可以包含的值在
-9223372036854775808L到9223372036854775807L (263)之间。
Java初学者常常会问,为什么需要使用后缀l或L,因为即便没有后缀,就像如下的代码一样,程序仍然能够编译。
long a = 123;
并不完全是这样的。没有后缀L或l的一个整数字面值,会被看作是int类型。因此,如下的代码将会产生一个编译错误,因为9876543210超出了一个int的存储能力:
long a = 9876543210;`
为了解决这个问题,需要在数字的末尾添加一个L或l,如下所示:
long a = 9876543210L;```
long、int、short和byte也可以表示为二进制形式,只要使用前缀字母0B或0b就可以了。例如:
byte twelve = 0B1100; // = 12`
如果一个整数字面值太长了,可读性会受到影响。为此,从Java 7开始,我们可以在整数字面值中使用下划线来将数字分隔开。例如,如下两条语句具有相同的含义,但是第2条显然更容易阅读。
int million = 1000000;
int million = 1_000_000;```
将下划线放在什么位置无关紧要。可以每3个数字使用一个下划线,就像上面的例子所示,或者任意多个数字使用一个。如下给出更多的例子:
short next = 12_345;
int twelve = 0B_1100;
long multiplier = 12_34_56_78_90_00L;`
2.6.2 浮点数字面值
像0.4、1.23、0.5e10这样的数字都是浮点数。浮点数有如下几个部分:
- 一个整数部分。
- 一个小数点。
- 一个小数部分。
- 一个可选的指数。
以1.23为例。对于这个浮点数,整数部分是1,小数部分是23,没有可选的指数。在0.5e10中,0是整数部分,5是小数部分,10是指数。
在Java中,有两种类型的浮点数:
- float。32位大小。最大的正的float是3.40282347e+38,最小的正的有限非零的float是1.40239846e-45。
- double。64位大小。最大的正的double是1.79769313486231570e+308。最小的正的有限非零的double是4.94065645841246544e-324。
- 在float和double类型中,0的整数部分是可选的。换句话说,0.5可以写成.
5。此外,指数部分可以表示为e或E。
要表示浮点数字面值,可以使用如下的格式之一:
Digits . [Digits] [ExponentPart] f_or_F
. Digits [ExponentPart] f_or_F
Digits ExponentPart f_or_F
Digits [ExponentPart] f_or_F ```
注意,方括号之间的部分是可选的。
f_和F_部分使得浮点数字面值是float类型。如果没有这一部分,该浮点数字面值将是double类型。要明确地表示一个double类型的字面值,可以加D或d后缀。要表示一个double类型字面值,使用如下的格式之一:
Digits . [Digits] [ExponentPart] [d_or_D]
. Digits [ExponentPart] [d_or_D]
Digits ExponentPart [d_or_D]
Digits [ExponentPart] [d_or_D] `
在float和double类型中,ExponentPart定义为如下的形式:
ExponentIndicator SignedInteger ```
其中ExponentIndicator是e或者E,而SignedInteger是
Signopt Digits `
Sign是+或者-,加号是可选的。
float字面值的示例如下:
2e1f
8.f
.5f
0f
3.14f
9.0001e+12f```
如下是double字面值的示例:
2e1
8.
.5
0.0D
3.14
9e-9d
7e123D`
2.6.3 布尔字面值
布尔类型有两个值,字面值分别为true和false。例如,如下的代码声明了一个布尔变量includeSign,并且为其分配了一个true值。
boolean includeSign = true;```
####2.6.4 字符字面值
字符字面值是一个Unicode字符,或者是单引号括起来的一个转义序列。转义序列是无法使用键盘输入的Unicode字符或者在Java中具有特殊作用的Unicode字符的一种表示方法。例如,回车字符和换行字符用于终止一行,并且没有任何可视化的表示。要表示一个换行字符,需要对其转义,即写出其字符表示。此外,单引号字符需要转义,因为单引号用于将字符括起来。
如下是字符字面值的一些示例:
'a'
'Z'
'0'
'ü'`
如下是作为转义序列的字符字面值:
'\b' 回退字符
'\t' 制表字符
'\\' 反斜杠
'\'' 单引号
'\"' 双引号
'\n' 换行
'\r' 回车```
此外,Java允许我们对一个Unicode字符转义,以便能够使用ASCII字符的一个序列来表示一个Unicode字符。例如,字符£的Unicode代码是00A3。你可以编写如下的字符字面值来表示字符:
'£'`
然而,如果你没有什么办法来使用键盘输入这个字符,可以使用将其转义的方式: