本章内容 Java既是编程语言,也是平台 语法变一点,能力强好多 try-with-resources语句 提升异常处理能力 欢迎进入Java 7的世界!斗转星移,时过境迁。当尘埃落定,我们终于见到了Java 7的真容。虽然看起来有点陌生,但它必将带来全新的体验!跟随我们经历过这段探索之旅,你将进入更广阔的世界,发现更多新特性、更高明的编程技巧,并接触到JVM上运行的更多编程语言。 现在,我们先来热热身。虽然只是简单介绍,但还是能让你了解Java 7的强大特性。我们会先解释Java语言和平台的区别,因为有时人们会对这两种说法产生误解。 接着我们会介绍Coin项目,它汇聚了Java 7里短小精悍的新特性。我们会向你展示Java平台所接受、吸纳和发布的那些特性,就是它们构成了Java的变化。在此之后,我们会介绍Coin项目中新引入的6个主要特性。 你会学到新的语法,比如改进的异常处理方式(multi-catch)以及 try-with-resources结构,借此在处理文件或其他资源的代码中躲开那些烦人的bug。读完本章,你将能用全新的方式编写Java代码,并整装待发,准备好迎接更大的挑战! 让我们先来探讨一下Java作为语言和平台的双重角色,这是现代Java的核心。这个知识点将贯穿全书,是一个必须掌握的基本要点。 1.1 语言与平台 使用Java之前,我们要先弄清楚Java语言和Java平台之间的区别。然而,有时候不同的作者对语言和平台的构成会有不同的定义,所以人们有时不太清楚两者之间的区别,分不清是语言还是平台提供了代码使用的编程特性。 因为本书的大部分内容都需要你理解两者的区别,所以这里需要说明一下。以下是我们给出的定义。 Java语言 在“关于本书”中,我们提到Java语言是静态类型、面向对象的语言,希望 你对这种说法已经非常熟悉了。Java语言还有一个非常明显的特点,它是(或者说应该是)人类可读的。 Java平台 平台是提供运行时环境的软件。Java虚拟机(JVM)负责把类文件形式(人 类不可读)的代码链接起来并执行。JVM不能直接解释Java语言的源文件,你要先把源文件转换成类文件。 Java作为软件系统之所以能成功,主要因为它是一种标准。也就是说,它有规范文件描述它应该如何工作。不同的厂商或项目组可以据此推出自己的实现,这些不同实现的工作方式在理论上是相同的。规范虽然不能保证这些实现处理同一任务时表现如何,但可以保证处理结果的正确性。 控制Java系统的规范有多种,其中最重要的是《Java语言规范》(JLS)和《JVM规范》(VMSpec)。在Java 7中,这两者之间的界限愈发清晰。实际上,VMSpec不再引用JLS中的任何内容,如果你认为这是Java 7重视Java之外其他语言的信号,说明你有见微知著的能力!希望你能继续关注,接下来我们会更加深入地探讨这两个规范之间的差别。 提到Java的双重角色,你自然想问:“它们两者之间还有什么关联吗?”如果它们在Java 7中如此泾渭分明,又是如何共同形成我们所熟悉的Java系统的呢? 连接Java语言和平台之间的纽带是统一的类文件(即.class文件)格式定义。认真研究类文件的定义能让你获益匪浅,这是优秀Java程序员向伟大Java程序员转变的一个途径。图1-1展示了产生和使用Java代码的整个过程。 图1-1 Java源码被转换成 .class 文件,在JIT编译前被加载处理 如图所示,Java代码的演进过程从我们可以看懂的Java源码开始,然后由javac编译成.class文件,变成可以加载到JVM中的形式。值得注意的是,类文件在加载过程中通常都会被处理和修改。大多数流行框架(特别是打着“企业级”旗号的)都会在类加载过程中对类进行改造。 Java是编译型语言还是解释型语言? 大多数开发人员都知道,Java源文件需要编译成.class文件才能在JVM中运行。如果继续追问,许多开发人员还会告诉你说.class中的字节码首先会被JVM解释,但在稍后即时(JIT)编译。然而很多人将字节码含糊地理解为“在某种虚构的或简化的CPU上运行的机器码”。 实际上,JVM字节码更像是中途的驿站,是一种从人类可读的源码向机器码过渡的中间状态。用编译原理术语讲,字节码实际上是一种中间语言(IL)形态,不是真正的机器码。也就是说,将Java源码变成字节码的过程不是C或C++程序员所理解的那种编译。Java所谓的编译器javac也不同于gcc,实际上它只是一个针对java源码生成类文件的工具。Java体系中真正的编译器是JIT,如图1-1所示。 有人说Java是“动态编译”的,他们所说的编译是指JIT的运行时编译,不是指构建时创建类文件的过程。 所以如果被问及“Java是编译型语言还是解释型语言”,你可以回答“都是”。 希望我们已经把Java语言和Java平台之间的区别解释清楚了。接下来我们进入下一话题,看看Java 7中一些语法上的调整,先从Coin项目中的那些小变化开始。