Java ®编程语言是通用的,同时,基于类的,面向对象的语言。它设计得足够简单,以使许多程序员都能熟练使用该语言。Java编程语言与C和C ++有关,但组织方式却大不相同,其中省略了C和C ++的许多方面,并包括了其他语言的一些思想。它旨在成为一种生产语言,而不是研究语言,因此,正如CAR Hoare在其有关语言设计的经典论文中所建议的那样,该设计避免了包含新的和未经测试的功能。
Java编程语言是强类型和静态类型的。该规范清楚地区分了在编译时可以并且必须检测到的编译时错误与在运行时发生的错误。编译时通常包括将程序翻译成与机器无关的字节码表示形式。运行时活动包括执行程序所需的类的加载和链接,可选的机器代码生成和程序的动态优化以及实际的程序执行。
Java编程语言是一种相对高级的语言,因为无法通过该语言获得机器表示的详细信息。它包括自动存储管理,通常使用垃圾回收器来避免显式释放的安全性问题(如C free 或C ++ delete)。高性能垃圾收集的实现可能会有一定程度的暂停,以支持系统编程和实时应用程序。该语言不包含任何不安全的构造,例如没有索引检查的数组访问,因为这种不安全的构造会导致程序以未指定的方式运行。
通常将Java编程语言编译为Java虚拟机规范Java SE X Edition中定义的字节码指令集和二进制格式 。(X指某一具体Java版本)

规范的组织

第2章介绍语法和表示语言的语法和语法的符号。
第3章介绍了基于C和C ++的Java编程语言的词汇结构。该语言以Unicode字符集编写。它支持在仅支持ASCII的系统上写入Unicode字符。
第4章介绍类型,值和变量。类型分为基本类型和引用类型。
基本类型在所有机器上和所有实现中都定义为相同,且具有各种大小的二进制补码整数,单精度和双精度IEEE 754标准浮点数,boolean 类型和Unicode字符char类型。基本类型的值不共享状态。
引用类型是类类型,接口类型和数组类型。引用类型由动态创建的对象实现,这些对象可以是类的实例,也可以是数组的实例。可以存在对每个对象的许多引用。所有对象(包括数组)都支持类Object的方法,Object是类层次结构的(单个)根。预定义String类支持Unicode字符串。存在用于将基本值包装在对象内部的类。在许多情况下,包装和解包是由编译器自动执行的(在这种情况下,包装称为装箱,而解包称为拆箱)。类和接口声明可以是泛型的,也就是说,它们可以由其他引用类型进行参数化。然后可以使用特定的类型参数调用此类声明。
变量是类型化的存储位置。基本类型的变量保存该确切基本类型的值。类类型的变量可以保存空引用,或对类型为该类类型或该类类型的任何子类的对象的引用。接口类型的变量可以包含空引用,或对实现该接口的任何类的实例的引用。数组类型的变量可以包含空引用,或对数组的引用。类类型Object的变量可以保存空引用或对任何对象的引用,无论是类实例还是数组。
第5章介绍了转化和数字提升。转换会更改编译时类型,有时还会更改表达式的值。这些转换包括基本类型和引用类型之间的装箱和拆箱转换。数字提升用于将数字运算符的操作数转换为可以执行操作的通用类型。语言没有漏洞;在运行时检查引用类型的强制类型转换,以确保类型安全。
第6章介绍了声明和命名,以及如何确定名称的含义(即名称表示的声明)。Java编程语言不需要在使用类和接口或其成员之前对其进行声明。声明顺序仅对局部变量,局部类,以及类或接口中的字段初始化程序的顺序有意义。此处描述了使程序更具可读性的推荐命名约定。
第7章介绍了程序的结构,该程序以包的形式进行组织。包的成员是类,接口和子包。包及其成员在层次命名空间中具有名称。Internet域名系统通常可以用来形成唯一的程序包名称。编译单元包含作为给定包的成员的类和接口的声明,并且可以从其他包中导入类和接口以为其命名。
包可以分组为模块,这些模块在构建大型程序时充当构建块。模块的声明指定了需要哪些其他模块(进而是程序包,进而是类和接口),以便在其自己的程序包中编译和运行代码。
Java编程语言支持在外部访问包,类和接口的成员的限制。包的成员只能由同一包中的其他成员,或同一模块的其他包中的成员,或不同模块中的包成员单独访问。类似的约束适用于类和接口的成员。
第8章介绍了类。类的成员是类,接口,字段(变量)和方法。类变量每个类仅存在一次。类方法的操作无需引用特定对象。实例变量是在作为类实例的对象中动态创建的。实例方法是在类的实例上调用的。this的实例在执行期间成为当前对象,从而支持面向对象的编程风格。
类支持单一继承,其中每个类都有一个超类。每个类都从其超类继承成员,并最终从Object继承。类类型的变量可以引用该类或该类任何子类的实例,从而可以将新类型与现有方法多态地一起使用。
类支持使用synchronized方法进行并发编程。方法声明了可能因执行而产生的检查异常,这允许编译时检查以确保处理异常情况。对象可以声明一个将在垃圾回收器丢弃对象之前调用的finalize方法,从而允许对象清理其状态。
为简单起见,该语言既没有与类的实现分开的声明“标头”,也没有单独的类型和类层次结构。
类的特殊形式,枚举,支持小值集的定义及其以类型安全的方式进行操作。与其他语言中的枚举不同,枚举是对象,并且可能具有自己的方法。
第9章介绍接口。接口的成员是类,接口,常量字段和方法。否则不相关的类可以实现相同的接口。接口类型的变量可以包含对实现接口的任何对象的引用。
类和接口支持从接口的多个继承。实现一个或多个接口的类可以从其超类和其超接口继承实例方法。
注解类型是用于注解声明的专用接口。不允许此类注解以任何方式影响Java编程语言中程序的语义。但是,它们为各种工具提供了有用的输入。
第10章介绍数组。数组访问包括边界检查。数组是动态创建的对象,可以分配给Object类型的变量。该语言支持数组的数组,而不是多维数组。
第11章介绍了异常,这些异常是不可恢复的,并且与语言语义和并发机制完全集成在一起。共有三种异常:检查异常,运行时异常和错误。编译器通过要求方法或构造函数仅在方法或构造函数声明了该异常的情况下,才能确保检查异常得以正确处理。这可以提供编译时检查是否存在异常处理程序,并有助于进行大型编程。大多数用户定义的异常应为检查异常。Java虚拟机检测到的程序中的无效操作会导致运行时异常,例如NullPointerException。错误是由Java虚拟机检测到的故障导致的,例如OutOfMemoryError。大多数简单的程序都不会尝试处理错误。
第12章介绍了在程序执行期间发生的活动。程序通常以表示已编译类和接口的二进制文件存储。这些二进制文件可以加载到Java虚拟机中,链接到其他类和接口并进行初始化。
初始化之后,可以使用类方法和类变量。可以实例化某些类,以创建类类型的新对象。作为类实例的对象,还包含该类的每个超类的实例,并且对象创建涉及这些超类实例的递归创建。
当不再引用对象时,垃圾回收器可以回收该对象。如果对象声明了终结器,则在回收该对象之前执行终结器,以使该对象有最后机会清理原本不会释放的资源。当不再需要一个类时,可以将其卸载。
第13章介绍了二进制兼容性,详细说明了类型更改对使用更改后的类型但尚未重新编译的其他类型的影响。这些注意事项对于通常通过Internet以连续系列版本广泛分发的类型的开发人员来说是很重要的。好的程序开发环境会在更改类型时自动重新编译相关代码,因此大多数程序员不必担心这些细节。
第14章介绍了基于C和C ++的块和语句。该语言没有goto声明,但包括带标签的breakcontinue声明。与C不同,Java编程语言在控制流语句中需要boolean(或 Boolean)表达式,并且不会将类型boolean隐式转换(通过拆箱除外),以期在编译时捕获更多错误。一条synchronized 语句提供了基本的对象级监视器锁定。一个try 语句可以包括catchfinally语句,以防止非本地控制转移。
第15章介绍表达式。本文档完全指定了表达式评估的(明显)顺序,以提高确定性和可移植性。重载的方法和构造器在编译时通过从适用的方法或构造器中选择最具体的方法或构造器来解决。
第16章介绍了该语言确保在使用之前确定设置局部变量的精确方法。尽管所有其他变量都会自动初始化为默认值,但是Java编程语言不会自动初始化局部变量,以避免掩盖编程错误。
第17章介绍了线程和锁的语义,它们基于Mesa编程语言最初引入的基于监视器的并发。Java编程语言为支持高性能实现的共享内存多处理器指定了内存模型。
第18章介绍了各种类型推断算法,这些算法用于测试泛型方法的适用性,并在泛型方法调用中推断类型。
第19章介绍了该语言的句法语法。

范例程序

本文中给出的大多数示例程序都可以执行,并且在形式上类似于:

  1. class Test {
  2. public static void main(String[] args) {
  3. for (int i = 0; i < args.length; i++)
  4. System.out.print(i == 0 ? args[i] : " " + args[i]);
  5. System.out.println();
  6. }
  7. }

在安装了Oracle JDK的计算机上,可以通过提供以下命令来编译和执行存储在文件中的Test.java类:

  1. javac Test.java
  2. java Test Hello, world.

生成输出:

  1. Hello, world.

记号

在整个规范中,我们指的是从Java SE Platform API提取的类和接口。每当我们使用单个标识符N引用类或接口(在示例中声明的对象除外)时,预期的引用就是java.lang包中名为N的类或接口。 对于java.lang以外的包中的类或接口,我们使用规范名称。
旨在澄清规范的非规范性信息以较小的缩进文本形式给出。
这是非规范性信息。它提供了直觉,理由,建议,示例等。
Java编程语言的类型系统有时依赖于替换的概念。记号[F:=T,...,F:=T] 取代F 满足 T ,1 ≤ in。

_与预定义类和接口的关系

如上所述,此规范通常引用Java SE Platform API的类。特别是某些类与Java编程语言有特殊的关系。例子包括类,如ObjectClassClassLoaderStringThread,和java.lang.reflect包中的类和接口,等等。本规范限制了此类和接口的行为,但未提供它们的完整规范。读者可以参考Java SE Platform API文档。
因此,本说明书没有详细描述反射。许多语言结构在Core Reflection API(java.lang.reflect)和Language Model API(javax.lang.model)中都有类似说明,但此处通常不讨论它们。例如,当我们列出创建对象的方式时,通常不包括Core Reflection API可以完成此操作的方式。读者应注意这些额外的机制,即使本文中未提及。

预览功能

预览功能是完全指定的,完全实现了Java编程语言的一个新的功能,然而是暂时的。在特定版本的Java SE平台的实现中可以使用它,以根据实际使用情况激发开发人员反馈。这可能导致它在Java SE Platform的将来版本中成为永久性。
实现必须在编译时和运行时都禁用由Java SE Platform的给定发行版定义的预览功能,除非用户在编译时和运行时通过主机系统指示要启用预览功能。 。
给定的Java SE Platform版本定义的预览功能在独立的文档中指定,这些文档指示对该版本的Java语言规范的更改(“差异”) 。预览功能的规格被合并到该Java ®语言规范,通过引用并提出了其一部分,当且仅当预览功能是在编译时启用。
可以在指定Java®语言规范的Oracle网站上找到指定这些预览功能的独立文档: https://docs.oracle.com/javase/specs/
预览功能可能与Java SE Platform API的元素相关联。即,如果java.langjava.lang.annotation包中存在API元素,则该元素必不可少,并且程序在不直接(或间接)引用该API元素的情况下不能使用预览功能。
如果禁用了预览功能,则在程序元素的声明(无论是显式还是隐式声明)中使用了必需的API元素(按名称覆盖,调用或按名称引用)时,就会发生编译时错误。
如果启用了预览功能,则如果在程序元素的声明(无论是显式还是隐式声明)中使用了必需的API元素(按名称覆盖,调用或按名称引用),则Java编译器必须产生预览警告,除非:

  • 该使用位于声明中,该声明本身是必不可少的API元素。要么
  • 该用法位于声明中,以禁止预览警告;要么
  • 使用出现的声明和基本API元素的声明都在同一最外层类中;要么
  • 该用法在导入基本API元素的import声明中。