Java ®语言是一种通用的、并发的、基于类的、面向对象的语言。它的设计非常简单,许多程序员可以达到流利使用的语言。Java编程语言与 C 和 C++ 但组织方式相当不同,其中省略了 C 和 C++的许多方面,并包含其他语言的一些想法。它的目的是一种生产语言,而不是研究语言,因此,正如C.A.R.Hoare在他的关于语言设计的经典论文中建议的那样,设计避免了包括新的和未经测试的功能。
Java 编程语言是强和静态的。此规范清楚地区分了在编译时可以而且必须检测到的编译时间错误和在运行时发生的编译时间错误。编译时间通常包括将程序转换为独立于计算机的字节代码表示形式。运行时活动包括加载和链接执行程序所需的类、可选的机器代码生成和程序的动态优化以及实际程序执行。
Java 编程语言是一种相对高级的语言,因为计算机表示的详细信息无法通过该语言提供。它包括自动存储管理(通常使用垃圾回收器),以避免显式释放的安全问题(如 C 或 C++ 中的 )。高性能垃圾回收实现可以有边界暂停以支持系统编程和实时应用程序。该语言不包含任何不安全的构造,例如没有索引检查的数组访问,因为此类不安全构造将导致程序以未指定的方式运行。free``delete
Java编程语言通常编译为在Java虚拟机规范,JavaSE8版中定义的字节码指令集和二进制格式。
1.1. 规范的组织
第 2 章介绍用于呈现语言的词汇和句法语法的语法和符号。
第 3 章介绍了基于 C 和 C++ 的 Java 编程语言的词汇结构。该语言以 Unicode 字符集编写。它支持在仅支持 ASCII 的系统上写入 Unicode 字符。
第 4 章介绍类型、值和变量。类型细分为基元类型和引用类型。
基元类型在所有计算机和所有实现中被定义为相同,并且是两个互补整数、单精度和双精度 IEEE 754 标准浮点数字、类型和 Unicode 字符类型的各种大小。基元类型的值不共享状态。boolean``char
引用类型是类类型、接口类型和数组类型。引用类型由动态创建的对象实现,这些对象是类或数组的实例。可以存在对每个对象的许多引用。所有对象(包括数组)都支持 类 的方法,它是类层次结构的(单个)根。预定义的类支持 Unicode 字符串。存在用于在对象内部包装基元值的类。在许多情况下,包装和解包由编译器自动执行(在这种情况下,包装称为装箱,解包称为拆箱)。类和接口声明可能是泛型的,也就是说,它们可能由其他引用类型参数化。然后,可以通过特定的类型参数调用此类声明。Object``String
变量是键入的存储位置。基元类型的变量包含该精确基元类型的值。类类型的变量可以保存对类型为该类类型的对象的 null 引用或引用,也可以保存该类类型的任何子类。接口类型的变量可以保存 null 引用或对实现接口的任何类的实例的引用。数组类型的变量可以保存空引用或对数组的引用。类类型的变量可以保存对任何对象的 null 引用或引用,无论是类实例还是数组。Object
第 5 章介绍转化和数字促销。转换更改编译时类型,有时更改表达式的值。这些转换包括基元类型和引用类型之间的装箱和取消装箱转换。数字促销用于将数字运算符的操作数转换为可以执行操作的通用类型。语言没有漏洞;在运行时检查参考类型的强制转换,以确保类型安全。
第 6 章介绍声明和名称,以及如何确定名称的意思(表示)。语言不需要在使用类型或其成员之前声明它们。声明顺序仅对局部变量、局部类和类或接口中字段的初始化器的顺序非常重要。
Java 编程语言提供对名称范围的控制,并支持对包、类和接口成员的外部访问限制。这有助于通过区分类型的实现及其用户和扩展类型的用户来编写大型程序。此处介绍了用于更可读程序的推荐命名约定。
第 7 章介绍了程序的结构,该程序被组织成类似于 Modula 模块的包。包的成员是类、接口和子包。包分为编译单元。编译单元包含类型声明,可以从其他包导入类型,以给它们提供短名称。包在分层名称空间中具有名称,Internet 域名系统通常可用于形成唯一的包名称。
第 8 章介绍类。类的成员是类、接口、字段(变量)和方法。类变量每类存在一次。类方法在不引用特定对象的情况下运行。实例变量在类实例的对象中动态创建。实例方法在类的实例上调用;此类实例在执行过程中成为当前对象,支持面向对象的编程样式。this
类支持单个实现继承,其中每个类的实现派生自单个超类的实现,并最终派生自类。类类型的变量可以引用该类的实例或该类的任何子类的实例,从而允许将新类型与现有方法一起多态地使用。Object
类支持使用方法进行并发编程。方法声明执行时可能出现的选中异常,这允许编译时检查以确保处理异常条件。对象可以声明在垃圾回收器丢弃对象之前将调用的方法,允许对象清理其状态。synchronized``finalize
为简单起见,该语言既不具有独立于类实现的声明”标头”,也没有单独的类型和类层次结构。
一种特殊形式的类,列类,支持小组值的定义及其以类型安全的方式操作。与其他语言中的枚举不同,枚举是对象,可能有自己的方法。
第 9 章介绍接口类型,这些类型声明一组抽象方法、成员类型和常量。否则不相关的类可以实现相同的接口类型。接口类型的变量可以包含对实现接口的任何对象的引用。支持多个接口继承。
注释类型是用于注释声明的专用接口。此类注释不允许以任何方式影响 Java 编程语言中程序的语义。但是,它们为各种工具提供了有用的输入。
第 10 章介绍数组。数组访问包括边界检查。数组是动态创建的对象,可以分配给类型的变量。该语言支持数组数组,而不是多维数组。Object
第 11 章介绍了非重复和与语言语义和并发机制完全集成的异常。有三种例外:选中的异常、运行时异常和错误。编译器通过要求方法或构造函数只有在方法或构造函数声明时才能导致选中的异常,确保正确处理已检查的异常。这提供了编译时检查是否存在异常处理程序,并辅助大型编程。应检查大多数用户定义的异常。Java 虚拟机检测到的程序中的无效操作会导致运行时异常,例如 。错误由 Java 虚拟机检测到的故障导致,例如 。大多数简单的程序不会尝试处理错误。NullPointerException``OutOfMemoryError
第 12 章介绍在程序执行期间发生的活动。程序通常存储为表示编译的类和接口的二进制文件。这些二进制文件可以加载到 Java 虚拟机中,链接到其他类和接口,并初始化。
初始化后,可以使用类方法和类变量。某些类可以实例化以创建类类型的新对象。类实例的对象还包含类的每个超类的实例,并且对象创建涉及这些超类实例的递归创建。
当不再引用对象时,垃圾回收器可能会回收该对象。如果对象声明了最终化器,则在回收对象之前执行最终化器,以便为对象提供最后一次机会来清理本来不会释放的资源。当不再需要类时,可能会卸载它。
第 13 章介绍二进制兼容性,指定对类型的更改对使用已更改类型但未重新编译的其他类型的影响。这些注意事项是开发人员感兴趣的类型,将广泛分发,在连续系列的版本,往往通过 Internet。好的程序开发环境会在类型更改时自动重新编译从属代码,因此大多数程序员无需关注这些详细信息。
第 14 章介绍了基于 C 和C++。该语言没有语句,但包括标记和语句。与 C 不同,Java 编程语言在 control-flow 语句中需要 (或 ) 表达式,并且不会将类型隐式转换为类型(通过取消装箱除外),希望捕获更多错误。语句提供基本的对象级监视器锁定。语句可以包括 和 子句,以防止非本地控制传输。goto``break``continue``boolean``Boolean``boolean``synchronized``try``catch``finally
第 15 章介绍表达式。本文档完全指定表达式评估的(明显)顺序,以便增加确定性和可移植性。重载方法和构造函数在编译时通过从适用的方法或构造函数中选取来解析。
第 16 章描述了语言确保在使用前确定局部变量的确切方式。虽然所有其他变量都自动初始化为默认值,但 Java 编程语言不会自动初始化本地变量,以避免掩盖编程错误。
第 17 章介绍了线程和锁的语义,这些语义基于最初与 Mesa 编程语言引入的基于监视器的并发关系。Java 编程语言为支持高性能实现的共享内存多处理器指定内存模型。
第 18 章介绍了用于测试泛型方法的适用性并在泛型方法调用中推断类型的各种类型推理算法。
第 19 章介绍了语言的句法语法。**
1.2. 示例程序
文本中给出的大多数示例程序已准备好执行,其形式与:
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.