《Java 语言规格说明》由会员分享,可在线阅读,更多相关《Java 语言规格说明(9页珍藏版)》请在金锄头文库上搜索。
1、J ava 语言规格说明( 译自 Java language specification )1. 程序结构 Java 语言的源程序代码由一个或多个编译单元 (compilationunit) 组成,每个编译单元只能包含下列内容 ( 空格和注释除外 ) :* 一个程序包语句 (package statement )* 引入语句 (import statements)* 类的声明 (class declarations)* 界面声明 (interface declarations) 每个 Java 的编译单元可包含多个类或界面,但是每个编译单元却至多有一个类或者界面是公共的。Java 的源程序代码
2、被编译之后,便产生了 Java 字节代码 (bytecode) 。Java 的字节代码由一些不依赖于机器的指令组成,这些指令能被 Java 的运行系统 (runtime system) 有效地解释。 Java 的运行系统工作起来如同一台虚拟机。在当前的 Java 实现中,每个编译单元就是一个以 .java 为后缀的文件。每个编译单元有若干个类,编译后,每个类生成一个 .class 文件。 .class文件是 Java 虚机器码 ? 2. 词法问题 在编译的过程中, Java 源程序代码中的字符被划分为一系列的标记 (token) 。 Java 编译器可以识别五种标记 : 标识符、关键字、字面量
3、、运算符以及特殊分隔符。注释以及诸如空格、制表符、换行符等字符 ,都不属于标识之列,但他们却常被用来分隔标记。Java 程序的编写采用泛代码 Unicode 字符集,若采用其它的字符集,则需在编译前转换成 Unicode 。2.1 注释Java 语言提供了 3 种形式的注释:/text 从 / 到本行结束的所有字符均作为注释而被编译器忽略。/* text */ 从 /* 到 */ 间的所有字符会被编译器忽略。/* text */ 当这类注释出现在任何声明之前时将会作特殊处理,它们不能再用在代码的任何地方。这类注释意味着被括起来的正文部分,应该作为声明项目的描述,而被包含在自动产生的文档中。2.
4、2 标识符 标识符的首字符必须是一个字母,下划线 (_) 或美元符号($) 。 后面的字符也可是数字 0-9 。 Java 使用泛代码字符集,为了便于识别好一合法标识符,下面列出它的 “字母”:* 大写字母 “ A ” “ Z ”* 小写字母 “ a ” “ z ”* 泛代码 ( Unicode )中所有字符编码在十六进制数 00C0 之前的字符。标识符中,首字母后的字符可以是任意的。当然, Unicode 区段中那些被保留作特殊字符的除外。由此, “ garton ”及 “ Mj lner ”都是合法标识符,但是,包括诸如 “”的字符串却不是合法的。为了取得更多的有关泛代码标准的信息,请参阅
5、 “ The UnicodeStandard ”,“ World Wide Character Encoding version 1.0 , volumes 1 2 ”, Unicode公司的 FTP 地址是 unicode.org 。2.3 关键字下面的标识符被保留用作关键字,他们不能作任何其它的用途。abstract default goto*null synchronizedboolean do if packagethisbreakdouble implementsprivatethreadsafebyteelseimportprotectedthrowbyvalve*extendsi
6、nstanceofpublictransientcasefalseintreturntruecatchfinalinterface shorttrycharfinally longstaticvoidclassfloat nativesuperwhileconst * fornew switchcontinue其中,加 * 标记后是被保留但当前却未使用的。2.4 字面量 字面量 (literal) 是某些类型值的基本表述,这些类型包括整型,浮点型,布尔量,字符及字符串。2.4.1 整型字面量 整数可有三种表示形式: 十进制,八进制和十六进制。一个十进制整型字面量由一系列的数字组成,但它的第一个
7、数字不能是 0( 有时十进制数字也可象下面讲的那样加后缀 ) 。整数也可表达成八进制或十六进制形式。以 0 开头的整型字面量,意味着它是一个十六进制的。十六进制整数可以包括数字 0-9 以及字母 a-f 及 A-F 。八进制整数中则只能是出现数字 0-7 。在超过 32 位所能表示的范围之前,整型字面量的类型即为 int ,否则为 long 型。一个整型字面量可通过加后缀 L 或 l 而强迫成 long 型。下面的均为合法的整型字面量。22L0777 2.4.2 浮点字面量 一个浮点字面量可包括以下部分 : 一个十进制整数,一个小数点 “ . ”,小数部分 ( 另外一个十进制整数 ) ,指数部
8、分,一个类型后缀。指数部分是一个 e 或 E 后跟一个整数。浮点字面量至少包含有一个数字,外加或者一个小数点或者一个 e( 或 E) ,下面举一些浮点字面量的例子:3.14153.1E12.1e122E12 就象在后面描述的那样, Java 语言有两种浮点类型: float 及 double ,用户可按以下写法区分:2.0d 或 2.0Ddouble 型2.0f 或 2.0F 或 2.0float 型 2.4.3 布尔字面量布尔 (boolean) 字面量有两个值: true 及 false 。2.4.4 字符字面量 字符字面量是一个由单引号括起的字符 ( 或者是由一组字符来表述一个字符 )
9、。字符属于 char 类型,并且均从泛代码字符集中得来。而下面列出的转义序列则用来描述一些非图形字符,它们以反斜杠 “ ”开始以作转义用。续行符头 换行 NL(LF)n 垂直制表符 HTt 退格 BSb 回车 CRr走纸换页 FFf 反斜杠 单引号 双引号 八进制数 0ddd ddd十六进制数 0xdd xdd 泛代码字符 0xddddudddd 2.4.5 串字面量 串字面量是双引号引起的零个或多个字符的序列。每个串字面量被看作是一个串对象,而并非是一个字符的数组,例如 “ abc ”创建了一个新的串类的实例。下面的都是合法的串字面量: 空串 只包含一个双引号的串This is a stri
10、ngThis is a two-line string2.5 运算符及特殊分隔符下面这些字符在 Java 源程序中作运算符或分隔符用:+ ! %&* / = != +=-=*= /=&= /= %= = = &后面还要在运算符一节中作详细介绍。3. 类型任何一个变量或表达式都有一个类型,类型决定变量可能的取值范围,决定对这些值允许的操作,以及这些操作的意义是什么。 Java 语言中提供了内置定义类型,程序员也可以利用类及界面 (interface) 机制构造新类型。Java 语言有两种类型: 简单类型和复合类型。简单类型指那些不能再分割的原子类型。如:整型、浮点型、布尔型、字符型均为简单类型。
11、复合类型建立在简单类型的基础上。 Java 语言有三种复合类型:数组、类及界面。在本节中,我们主要讨论简单类型及数组。3.1 数值类型 3.1.1 整数类型整数与 C 及 C+ 中相似,但有两点区别: 其一,所有的整数类型均是独立于机器的;其二,对某些传统的定义作出改变,以反映自 C 问世以来所带来的变化,四种整数类型分别具有 8 位、 16 位、 32 位及 64 位的宽度,并且均是有符号的 (signed) 。如下所示:宽度类型名8byte16short32int64long 一个变量的类型不会直接影响它的存储的分配,类型仅仅决定变量的算术性质以及合法的取值范围。如果把一个超出合法范围的值
12、赋给一变量,那么这个值将是对合法值域取模后的值。3.1.2 浮点类型关键字 float 表示单精度 (32 位 ) ,而 double 则表示双精度(64 位 ) ,两个 float 型数运算的结果仍是 float 型,若有其中之一为 double型,则结果为 double 型。浮点运算及数据格式按 IEEE754 中的定义,细节问题请参阅 “附录 A : 浮点”中有关浮点实现的细节。3.1.3 字符类型 Java 全部使用泛代码字符集,因此 char 类型数据被定义成一个 16 位的无符号整数。3.2 布尔类型当一个变量的取值或为 ture 或为 false ,或者是当一个方法的返回值为 t
13、ure 或 false 时,它 ? 嵌 际 遣 级 嘈 偷 摹 硗 猓 叵 翟 怂 愕 慕 峁 嗍遣 ? 尔型的。布尔值不是数值型,因此不能用强制类型转换把它们转化成数值。3.3 数组数组在 Java 语言中属第一类对象。由它们代替了指针运算,所有的对象 ( 包括数组 ) 都可通过标识来引用。即使被当作数运算,标识的值也不应被破坏。通过 new 运算符可创建一个数组。char s=new char30; 数组第一元素的下标为 0 ,在声明中指定维数是不允许的。每次都必须显式地用 new 分配数组:int i =new int 3;Java 语言不支持多维数组,但是,程序员却可以创建数组的数组。
14、int i =new int 34;至少有一维要明确给定,而其它维则可在以后再确定。例如:int i =new int 3 是一个合法的声明。除了在变量名及方法名后跟方括号这种 C 风格的声明之外, Java 语言允许方括号跟在数组类型之后,下面两行是等价的:int iarray ;int iarray;同样地,方法声明也一样:byte f(int n) ;byte f(int n);运行时检查下标保证它们是合法的:int a =new int 10;a5=1;a1=a0+a2;a-1=4; / 运行时引发一个ArrayIndexOutOfBoundsException( 数组下标越界 ) 异
15、常 a10=2; / 运行时引发一个 ArrayIndexOutOfBoundsException( 数组下标越界 ) 异常数组的大小必须使用整数表达式:int n;float arr =new floatn+1数组的长度可通过 .length 查找:int a =new int 103;println (a.length) / 打印出 10println (a0.length) / 打印出 3 。3.3.1 数组细节我们所定义的数组都是 Object 类的一个子类的实例,在类的层次结构中有一个被称为 Array 的子类,它有一个实例变量 “ length ”。对每一个基本类型,都有一个相应的 Array 的子类。同理,每一个类也都有一个相应的 Array 子类存在。例如: new Threadn 创建一个 Thread 的实例。如果类 A 是类 B 的超类,那么, A 是 B 的超类,见下图:ObjectArray Aint float ABB因此,可以把数组赋给一个 Object 变量。Object o;int a=new int 10;o=a;并且可通过强制类型转换把 object 变量赋给一数组变量。a=(int )o;Array 类本身不能显式地产生子类。4. 类