Java® 编程语言是一种通用的、并发的、基于类的、面向对象的语言。它被设计得足够简单,以至于许多程序员都能熟练使用该语言。Java 编程语言与 C 和 C++ 有关,但其组织方式却截然不同,它省略了 C 和 C++ 的许多方面,并包含了其他语言的一些思想。它是一种生产语言,而不是一种研究语言,因此,正如 C. A. R. Hoare 在他关于语言设计的经典论文中建议的那样,设计避免包含新的和未经测试的功能。
Java 编程语言是强类型和静态类型的。该规范清楚地区分了编译时错误(可以且必须在编译时检测到)和运行时发生的错误、编译时通常包括将程序装换为与机器无关的字节码表示形式。运行时活动包括加载和链接执行程序所需的类、可选的机器底阿妈生成和程序的动态优化、以及实际的程序执行。
Java 编程语言是一种相对高级的语言,因为通过该语言无法获得机器表示的细节。它包括自动存储管理,通常使用垃圾收集器以避免显式释放的安全问题(如 C 的 free
或 C++ 的 delete
)。高性能的垃圾收集实现可以有有限的暂停,以支持系统编程和实施应用程序。该语言不包括任何不安全的结构,例如不进行索引检查的数组访问,因为这种不安全的结构将导致程序以未指定的方式运行。
Java 编程语言通常被编译成* Java 虚拟机规范 Java SE 8 版* 定义的字节码指令集和二进制格式。
1.1 Organization of the Specification
第 2 章描述了语法和用来表示语言的词汇语法和句法语法的符号。
第 3 章描述了基于 C 和 C++ 的 Java 编程语言的词法结构。该语言是用 Unicode 字符集编写的、它支持在只支持 ASCII 的系统上编写 Unicode 字符。
第 4 章描述了类型、值和变量、类型被细分为基本类型(primitive types)和引用类型(reference types)。
基本类型被定义为在所有机器和所有实现中是相同的,并且是各种大小的二进制补码整数、单精度和双精度 IEEE 754 标准浮点数、布尔类型和 Unicode 字符 char 类型。基本类型的值不共享状态。
引用类型是类(class)类型、接口(interface)类型和数组(array)类型。引用类型由动态创建的对象实现,这些对象可以是类或数组的实例。可以存在对每个对象的许多引用。所有对象(包括数组)都支持类对象的方法,类对象是类层次结构的(单一)根。预定义的字符串(String
)类支持 Unicode 字符串。存在用于在对象内部包装原始值的类。在许多情况下,包装和解包是由编译器自动执行的(在这种情况想,包装称为装箱(boxing),解包成为拆箱(unboxing))。类和接口声明可以是泛型的,也就是说,它们可以被其他引用类型参数化。然后可以用特定的类型参数来调用这样的声明。
变量是类型化的存储位置。一个原始类型的变量保存该原始类型的值。一个类类型的变量可以包含一个空引用或一个对象的引用,该对象的类型是该类类型或该类类型的任何子类。接口类型的变量可以包含一个空引用或对实现该接口的任何类的实例的引用。数组类型的变量可以包含空引用或对数组的引用。Object
类类型的变量可以包含一个空引用或对任何对象的引用,无论是类实例还是数组。
第 5 章描述了转换和数字提升(numeric promotions)。转换会改变编译时类型,有时还会改变表达式的值。这些转换包括基本类型和引用类型之间的装箱和拆箱转换。数值提升用于将数值运算符的操作数转换为可执行运算的通用类型。语言上没有漏洞;在运行时检查引用类型的强制转换,以确保类型安全。
第 6 章描述了声明和命名,以及如何确定名字的含义。语言不要求在使用类型或其成员变量之前声明它们。声明顺序只对局部变量、局部类以及类或接口中字段的初始值设定项的顺序有意义。
Java 编程语言提供了对命名作用域的控制,并支持对包、类和接口成员的外部访问的限制。这对于大型项目中区分类型的用户和谁能扩展类型提供了很大的帮助。同时这里也给出了更加具有可读性程序的命名习惯。
第 7 章描述了程序的结构,程序的结构被组织成了各种包,这就像模块化概念中的各种模块。包的成员是类、接口和子包。每个包都是一个编译单元。每个编译单元包含类型声明的短名称和从其他包里导入的类型的短名称。包是以一个层次性命名空间进行命名的,因特网域名系统通常被用来组成唯一的包名。
第 8 章描述了类。类的成员包括类、接口、字段(变量)和方法。类方法的调用可以不使用对象的引用。实例变量是在作为类实例的对象中动态创建的。实例方法在类的实例上被调用;在方法执行期间实例就成为当前对象 this,以此支持面向对象的编程风格。
类支持单个实现继承,其中每个实现类派生于单个父类,最终都派生于类 Object
。类类型的遍历可以引用该类或该类的任何子类的实例,允许新类型以多种形式与现有方法一起使用。
类支持使用同步方法进行并发编程。方法声明了在执行过程中可能出现的检查异常,这允许编译时检查以确保异常情况得到处理。对象可以声明一个 finalize
方法,该对象将在对象被垃圾收集器丢弃之前被调用,从而允许对象清理它们的状态。
为了简单起见,Java 语言没有将声明头文件(C 和 C++ 用头文件提前声明类名,函数名)和类的实现分开,也没有分开的类型和类层次结构。
一种特殊形式的类,枚举,支持小型值集的定义,以及以类型安全的方式对它们进行操作。与其他语言中的枚举不同,枚举是对象,可能有自己的方法。
第 9 章描述了接口类型,它声明了一组抽象方法、成员类型和常量。在其他方面不相关的类可以实现相同的接口类型。接口类型的变量可以包含对实现该接口的任何对象的引用。支持多接口继承。
注解类型属于特殊接口用来做注解声明。Java 程序语言中这种注解任何方面都不会影响程序的语义。然而,注解给各种工具提供了非常有用的输入。
第 10 章描述了数组。数组访问包括边界检查。数组是动态创建的对象,可以赋值给 Object
类型的变量。Java 语言支持数组的数组,而不是多维数组。
第 11 章描述了异常,它是不可恢复的,并与语言的语义和并发机制完全集成。Java 语言提供了三种类型的异常:收件异常(checked exception)、运行时异常(run-time exception)、错误(error)。编译器只保证方法和构造器上具有受检异常声明的哪些异常会被合适的处理。者提供了编译使其检查异常处理器的存在,极大的保证了程序正常。大多数用户定义的异常都应该是受检异常。Java 虚拟机检测到的程序中的无效操作会导致运行时异常,例如 NullPointerException
。错误是由 Java 虚拟机检测到的错误导致的,比如 OutOfMemoryError
。大多数简单的程序不会去处理错误异常。
第 12 章描述了在程序执行过程中发生的活动。程序通常存储为已编译类和接口的二进制文件。这些二进制文件可以加载到 Java 虚拟机中,链接到其他类和接口,并进行初始化。
在初始化后,可以使用类方法和类变量。可以实例化一些类以创建类类型的新对象。作为类实例的对象还包含类的每个父类的一个实例,对象的创建涉及到这些父类实例的递归创建。
当一个对象不再被引用时,他可能会被垃圾收集器回收。如果对象声明了终结器(finalizer),则在对象被回收之前会执行终结器,以给对象最后一次机会来清理,否则那些资源无法被释放。当不再需要某个类时,可以将其卸载。
第 13 章描述了二进制兼容性,说明了对于那些还没有重新编译,但是引用了修改类的类的影响。这些考虑因素是开发人员感兴趣的,开发人员通常会通过 Internet 在一系列连续的版本中广泛分发这些类型的产品。好的程序开发环境会在类型改变时自动重新编译相关代码,所以大多数程序员不需要关心这些细节。
第 14 章描述了基于 C 和 C++ 的块(block)和语句(statements)。该语言没有 goto
语句,但是有带标签的 break
和 continue
语句。与 C 不同,Java 编程语言要求在控制流语句中使用布尔(或布尔)表达式,并且不隐式地将类型转换为布尔(除了通过拆箱),希望在编译时捕捉更多的错误。synchronized
语句提供基本的对象级监视器锁定。try
语句可以包含 catch
和 finally
子句,以防止非本地控制转移(内部 Exception 会直接打断当前代码执行的流程)。
第 15 章描述了表达式。为了增加确定性和可移植性,这个文档明确了表达式求值的(明显的)顺序。重载的方法和构造函数会在编译时被解析到合适的而且最具体的方法和构造函数上。
第 16 章描述了语言确保局部变量在使用前被明确设置的精确方式。虽然所有其他变量都自动初始化为默认值,但 Java 编程语言不会自动初始化局部变量,以避免掩盖程序错误。
第 17 章描述了线程和锁的语义,这些都是基于源自 Mesa 程序语言提出的 monitor-based 并发性。Java 编程语言为支持高性能实现的共享内存多处理器指定了内存模型。
第 18 章描述了各种类型推断算法,用于测试泛型方法的实用性和推断泛型方法调用中的类型。
第 19 张介绍了 Java 语言的语法。
1.2 Example Programs
正文中给出的大多数示例程序都可以执行,并且在形式上类似于:
class Test {
public static void main(String[] args) {
for (int i = 0; i < args.length; i++)
System.out.print(i == 0 ? args[i] : " " + args[i]);
System.out.println();
}
}
在安装了 Oracle JDK 的机器上,可以通过给出以下命令来编译和执行这个存储在文件 Test.java
中的类:
javac Test.java
java Test Hello, world.
产生输出:
Hello, world.
1.3 Notation
在本规范中,我们只的是来自 Java SE 平台 API 的类和接口。每当我们使用单个标识符 N
引用一个类或接口(除了在实例中声明的那些)时,意图引用的是 java.lang
包中名为 N
的类或接口。对于 java.lang
之外的包中的类或接口,我们使用规范名称(canonical name,§6.7 )。
旨在阐明规范的非规范性信息以较小的缩进文本给出。
这是非规范性信息。它提供直觉、基本原理、建议、例子等。
Java 编程语言的类型系统有时依赖于替换的概念。符号 [F1:=T1, ..., Fn:=Tn] 表示 1 ≤ i ≤ n 是 Ti 对 Fi 的替换。
1.4 Relationship to Predefined Classes and Interfaces
如上所述,该规范经常引用 Java SE 平台 API 的类。特别是,有些类与 Java 编程语言有着特殊的关系。例如 Object
、Class
、ClassLoader
、String
、Thread
等类,以及 java.lang.reflect
包中的类和接口等。改规范约束了这些类和接口的行为,但没有为它们提供完整的规范。读者可以参考 Java SE 平台 API 文档。
因此,本规范没有详细描述反射。许多语言结构在核心反射 API(java.lang.reflect
)和语言模型 API(javax.lang.model
)中都有类似的内容,但这里一般不讨论这些内容。例如,当我们列出创建一个对象的方法时,我们通常不包括核心反射 API 完成这个任务的方法。读者应该知道这些额外的机制,即使它们在正文中没有提到。
1.5 Feedback
欢迎读者向 jls-jvms-spec-comments@openjdk.java.net 报告 Java 语言规范中的技术错误和歧义。
有关 javac
(Java 编程语言的参考编译器) 的行为,特别是它是否符合本规范的问题,可以发送给 compiler-dev@openjdk.java.net。
1.6 References
Bibliography
Apple Computer. Dylan Reference Manual. Apple Computer Inc., Cupertino, California. September 29, 1995.
Bobrow, Daniel G., Linda G. DeMichiel, Richard P. Gabriel, Sonya E. Keene, Gregor Kiczales, and David A. Moon.* Common Lisp Object System Specification*, X3J13 Document 88-002R, June 1988; appears as Chapter 28 of Steele, Guy. Common Lisp: The Language, 2nd ed. Digital Press, 1990, ISBN 1-55558-041-6, 770-864.
Ellis, Margaret A., and Bjarne Stroustrup. The Annotated C++ Reference Manual. Addison-Wesley, Reading, Massachusetts, 1990, reprinted with corrections October 1992, ISBN 0-201-51459-1.
Goldberg, Adele and Robson, David. Smalltalk-80: The Language. Addison-Wesley, Reading, Massachusetts, 1989, ISBN 0-201-13688-0.
Harbison, Samuel. Modula-3. Prentice Hall, Englewood Cliffs, New Jersey, 1992, ISBN 0-13-596396.
Hoare, C. A. R. Hints on Programming Language Design. Stanford University Computer Science Department Technical Report No. CS-73-403, December 1973. Reprinted in SIGACT/SIGPLAN Symposium on Principles of Programming Languages. Association for Computing Machinery, New York, October 1973.
IEEE Standard for Binary Floating-Point Arithmetic. ANSI/IEEE Std. 754-1985. Available from Global Engineering Documents, 15 Inverness Way East, Englewood, Colorado 80112-5704 USA; 800-854-7179.
Kernighan, Brian W., and Dennis M. Ritchie. The C Programming Language, 2nd ed. Prentice Hall, Englewood Cliffs, New Jersey, 1988, ISBN 0-13-110362-8.
Madsen, Ole Lehrmann, Birger Møller-Pedersen, and Kristen Nygaard. Object-Oriented Programming in the Beta Programming Language. Addison-Wesley, Reading, Massachusetts, 1993, ISBN 0-201-62430-3.
Mitchell, James G., William Maybury, and Richard Sweet. The Mesa Programming Language, Version 5.0. Xerox PARC, Palo Alto, California, CSL 79-3, April 1979.
Stroustrup, Bjarne. The C++ Progamming Language, 2nd ed. Addison-Wesley, Reading, Massachusetts, 1991, reprinted with corrections January 1994, ISBN 0-201-53992-6.
Unicode Consortium, The. The Unicode Standard, Version 6.2.0. Mountain View, California, 2012, ISBN 978-1-936213-07-8.