2.3 字面量
在Java中,字面量(literal)指人类可以阅读的固定值的表示。例如,数100是字面量。字面量也常常称为常量(constant)。大多数字面量及其用法非常直观,前面的示例程序中已经以各种形式使用过它们。现在正式地解释它们。
Java的字面量可以是任意基本数据类型。每种字面量的表示取决于类型。如前所述,字符常量由单引号包括。例如,'a'和'%'都是字符常量。
整数字面量是没有小数部分的数。例如,10和-10是整数字面量。浮点字面量有小数点,小数点后是小数部分。例如,11.123是浮点字面量。Java也允许使用科学计数法表示浮点数。这种情况下在尾数后使用E或e,然后再跟上指数。指数必须是整数。例如,1.234E2表示值123.4,1.234E-2表示值0.01234。
默认情况下,整数字面量的类型是int。如果需要指定long类型的字面量,需要在常量后加l或L。例如,12是一个int类型的字面量,但是12L是一个long类型的字面量。
默认情况下,浮点字面量是double类型的。要指定一个float类型的字面量,可以在常量后加f或F。例如,10.19F是一个float类型的字面量。
尽管整数字面量默认创建了一个int值,但是只要值可以由目标类型表示,它们仍可以赋给char类型、byte类型或short类型的变量。整数字面量总能赋给long类型的变量。
从JDK 7开始,可以在整数或浮点数中使用一条或多条下划线。这能让含有多个数字的值阅读起来更简单。当字面量在编译时,会丢弃下划线。下面是一个例子:
这指定了值123?451?234。下划线的使用在编码部件号、用户ID、状态编码等一般含有子数据群的数据时特别有用。
2.3.1 十六进制、八进制和二进制字面量
在编程中有时使用八进制或十六进制计数系统会比使用十进制计数系统更加简单。基于8的计数系统称为八进制(octal),它使用0~7的数字。八进制10等于十进制8。基于16的计数系统称为十六进制(hexadecimal),它使用数字0~9和字母A~F(也可以用小写字母a~f)。字母A~F表示10、11、12、13、14和15。例如,十六进制中的10表示十进制的16。因为常常使用这两种计数系统,所以Java不但允许以十进制表示整形字面量,也允许以十六进制或八进制表示整形字面量。十六进制字面量由0x或0X打头(即数字0后跟字母x或X)。八进制字面量以0打头。下面是一些例子:
感兴趣的是,Java也允许十六进制浮点字面量,不过这很少使用。
从JDK 7开始,可以用二进制指定整数字面量。为此,需要在二进制数前加0b或0B。例如,0b1100用二进制指定十进制值12。
2.3.2 转义字符序列
将字符常量包括在单引号内对绝大多数的字符都是可行的。但是对于一些字符(如回车),在使用文本编辑器时就出现特别的困难。另外,某些其他字符,如单引号和双引号,在Java中有特殊的意义,不能直接使用。所以,Java提供了特殊的转义序列(escape sequence),有时又称为反斜线字符常量,如表2-2所示。这些序列用于代替它们表示的字符。
例如,下面把制表符字符赋予变量ch:
下面的例子把单引号赋予ch:
2.3.3 字符串字面量
Java支持另一种字面量类型:字符串。字符串(string)是一系列字符,由双引号包围。例如,
就是一个字符串。在前面示例程序中的许多printf()语句中能看到许多字符串的例子。
除了一般的字符外,字符串字面量也能包括一个或多个刚刚介绍的转义序列。例如,考虑如下程序,它使用转义序列n和t。
输出如下所示:
注意如何用转义序列n来换行。这样就不需要写多个println()语句来获得多行输出。只要在一个长字符串中需要换行的地方包括转义字符n即可。