2.2 词法结构
本节说明 Java 程序的词法结构,首先介绍编写 Java 程序的 Unicode 字符集,然后介绍组成 Java 程序的标记,包括注释、标识符、保留字和字面量等。
2.2.1 Unicode字符集
Java 程序使用 Unicode 字符编写。在 Java 程序中,任何地方都能使用 Unicode 字符,包括 注释和标识符,例如变量名。7 位 ASCII 字符集只对英语有用,8 位 ISO Latin-1 字符集只 对大多数西欧语言有用,而 Unicode 字符集能表示世界上几乎所有常用的书写语言。
如果使用不支持 Unicode 的文本编辑器,或者不想强制查看或编辑你代码的程序员使用支持 Unicode 的编辑器,你可以使用特殊的 Unicode 转义序列
\uxxxx,把 Unicode 字符嵌入 Java 程序。Unicode 转义序列由反斜线、小写的字母 u 和四个十六进制字符组成。例如,\u0020是空格,\u03c0是字符 π。
Java 投入了大量时间和工程努力,确保能最好地支持 Unicode。如果业务应用面向全球用户,特别是西方之外的市场,Java 平台是很好的选择。
2.2.2 区分大小写与空白
Java 语言区分大小写,关键字使用小写,而且必须这么用;也就是说,While 和 WHILE 与 while 关键字不是一回事。类似地,如果在程序中把变量命名为 i,就不能使用 I 引用这个变量。
一般来说,通过大小写来区分标识符是非常糟糕的主意。在代码中不要这么做,尤其不要使用和关键字同名但大小写不同的标识符。
Java 会忽略空格、制表符、换行符和其他空白,除非这些符号出现在引号或字符串字面量 中。为了易读,程序员一般会使用空白格式化和缩进代码。本书的示例代码会使用一些常用的缩进约定。
2.2.3 注释
注释是使用自然语言编写的文本,供某一程序的人类读者阅读。Java 编译器会忽略注释。Java 支持三种注释。第一种是单行注释,以 // 字符开始,直到行尾结束。例如:
int i = 0; // 初始化循环变量
第二种是多行注释,以 /* 字符开始,不管有多少行,直到 */ 字符结束。javac 会忽略 /* 和 */ 之间的所有文本。虽然这种形式一般用于多行注释,但也可以用于单行注释。
这种注释不能嵌套,即 /* */ 中不能再有 /* */。编写多行注释时,程序员经常使用额外的 * 字符,突出注释的内容。下面是个典型的多行注释:
/** 首先,连接服务器。* 如果尝试连接失败,立即退出。*/
第三种注释是第二种的一个特例。如果注释以 /** 开头,会被当成特殊的文档注释。和普通的多行注释一样,文档注释也以 */ 结尾,而且不能嵌套。如果你编写了一个 Java 类,希望让其他程序员使用,可以直接在源码中嵌入关于这个类和其中每个方法的文档。名为 javadoc 的程序会提取这些文档,经过处理后生成这个类的在线文档。文档注释中可以包含 HTML 标签和 javadoc 能理解的其他句法。例如:
/*** 把文件上传到Web服务器中。** @param file要上传的文件。* @return <tt>true</tt>表示上传成功,* <tt>false</tt>表示上传失败。* @author David Flanagan*/
第 7 章会详细介绍文档注释的句法,第 13 章会详细介绍 javadoc 程序。
注释可以出现在 Java 程序中的任何标记之间,但不能出现在标记中。注释尤其不能出现在双引号字符串字面量中。字符串字面量中的注释就是这个字符串的一部分。
2.2.4 保留字
以下是 Java 的保留字(它们是 Java 语言句法的一部分,不能用来命名变量和类等):
abstract const final int public throwassert continue finally interface return throwsboolean default float long short transientbreak do for native static truebyte double goto new strictfp trycase else if null super voidcatch enum implements package switch volatilechar extends import private synchronized whileclass false instanceof protected this
后文还会见到这些保留字,其中有些是基本类型的名称,有些是 Java 语句的名称,这两种保留字稍后都会进行介绍。还有一些用于定义类和成员,第 3 章会介绍。
注意,虽然 Java 语言不使用 const 和 goto,但它们也是保留字;interface 还有另外一种形式——@interface,用来定义注解类型。有些保留字(尤其是 final 和 default)根据不同的上下文有不同的意义。
2.2.5 标识符
标识符就是 Java 程序中某个部分的名称,例如类、类中的方法和方法中声明的变量。标识符的长度不限,可以包含 Unicode 字符集中的任意字母和数字,但是不能以数字开头。一般来说,标识符不能包含标点符号,不过可以包含 ASCII 字符集中的下划线(_)和美元符号($),以及 Unicode 字符集中的其他货币符号,例如£和 ¥。
货币符号主要用在自动生成的源码中,例如
javac生成的代码。不在标识符中使用货币符号,可以避免自己的标识符和自动生成的标识符冲突。
按照规定,可以出现在标识符开头和之中的字符由 java.lang.Character 类中的 isJavaIdentifierStart() 和 isJavaIdentifierPart() 方法定义。
以下是合法标识符示例:
i x1 theCurrentTime the_current_time 獺
特别注意,其中有个 UTF-8 标识符——獺。这是一个汉字,英文是“otter”,完全是个合法的 Java 标识符。在主要是由西方人编写的程序中不常见到使用非 ASCII 字符的标识符,但偶尔也有。
2.2.6 字面量
字面量是直接出现在 Java 源码中的值,包括整数、浮点数、单引号中的单个字符、双引号中的字符串,以及保留字 true、false 和 null。例如,以下都是字面量:
1 1.0 '1' "one" true false null
2.3 节会详细介绍表示数字、字符和字符串字面量的句法。
2.2.7 标点符号
Java 标记中也有一些是标点符号。Java 语言规范把这些字符分成两类(有点随意):分隔符和运算符。分隔符有 12 个:
( ) { } [ ]... @ ::; , .
运算符如下:
+ - * / % & | ^ << >> >>>+= -= *= /= %= &= |= ^= <<= >>= >>>== == != < <= > >=! ~ && || ++ -- ? : ->
整本书中都会见到分隔符,2.4 节会分别介绍每个运算符。
如果使用不支持 Unicode 的文本编辑器,或者不想强制查看或编辑你代码的程序员使用支持 Unicode 的编辑器,你可以使用特殊的 Unicode 转义序列 