70

向后二进制兼容性(或向下兼容性) - 使用旧版本库 API 构建的客户端能够在新版本 ( wiki ) 上运行。

向上二进制兼容性(或向前兼容性)- 使用新版本的库 API 构建的客户端能够在旧版本 ( wiki ) 上运行。

Sun 关于自 1.4.2 以来 J2SE 5.0 中 JDK 不兼容性的一般文档(以及Java SE 6 与 J2SE 5.0的兼容性)描述了 JDK 的兼容性如下:

JDK 5.0与 Java 2 SDK v1.4.2向上二进制兼容,除了下面列出的不兼容性。这意味着,除了提到的不兼容性之外,使用 1.4.2 版编译器构建的类文件将在 JDK 5.0 中正确运行

我想文档作者在这句话中混淆了术语“向上”和“向后”兼容性。他们描述了“向后”兼容性,但将此功能称为“向上”兼容性。

这是一个错字,错误或预期的术语吗?JDK“向上”还是“向后”兼容?

4

8 回答 8

95

请注意,为了使某些东西向后兼容,必须有一个向前兼容的对应物(有意或无意)。例如:DVD 阅读器向后兼容 CD 还是 CD 向前兼容 DVD 阅读器?

在这种情况下,这取决于您是查看编译器(或其生成的字节码)还是虚拟机。

编译器不向后兼容,因为使用 Java5 JDK 生成的字节码不会在 Java 1.4 jvm 中运行(除非使用-target 1.4标志编译)。但是 JVM 是向后兼容的,因为它可以运行较旧的字节码。

所以我猜他们选择从 javac 的角度考虑兼容性(因为它是 JDK 特有的部分),这意味着生成的字节码可以在 jvm 的未来版本中运行(这与 JRE 更相关) ,但也捆绑在 JDK 中)。

简而言之,我们可以说:

  • JDK(通常)是前向兼容的。
  • JRE(通常)是向后兼容的。

(这也是一个早就应该吸取的教训:编写编译器的人通常是对的,而我们使用它们的人是错误的 xD)

顺便说一句,向后/向前和向下/向上配对而不是将它们混合在一起不是更有意义吗?

于 2011-01-14T15:34:17.197 回答
21

扩展答案以包括最新的 Java……</p>

Java SE 7 和 JDK 7 兼容性

来自 Oracle 未注明日期的页面的引用:

兼容性是一个复杂的问题。本文档讨论了与 Java 平台版本相关的三种潜在不兼容性:

  1. 源代码:源代码兼容性涉及将 Java 源代码转换为类文件,包括代码是否仍然可以编译。
  2. 二进制:二进制兼容性在 Java 语言规范中定义为保留无错误链接的能力。
  3. 行为:行为兼容性包括在运行时执行的代码的语义。

… 和

Java SE 7 和 Java SE 6 之间的不兼容性 Java SE 7 与Java 平台的早期版本高度兼容。几乎所有现有程序都应该在 Java SE 7 上运行而无需修改。但是,JRE 和 JDK 中存在一些较小的潜在源代码和二进制不兼容问题,这些问题涉及罕见的情况和“极端情况”,为了完整起见,此处记录了这些情况。

Java SE 7 语言、JVM 或 Java SE API 的不兼容性

… 和

JDK 7 和 JDK 6 之间的不兼容性

javac、HotSpot 或 Java SE API 中的 JDK 7 不兼容性

(那里没有序言——只是一个不兼容的列表。)

于 2012-08-22T08:11:04.267 回答
16

只能后退。前向兼容(“优雅地接受用于其自身更高版本的输入”)将要求 1.5 JVM 能够运行 1.6 编译代码,但它不能。

向后要求“如果它可以使用旧设备生成的输入”,这是正确的,因为 1.6 JVM 可以运行 1.5 编译代码。

JDK/JRE 的每个版本都对应一个 Java 字节码版本。每个编译器都会生成特定字节码版本的代码。每个 JVM 都理解一个版本和特定字节码版本的所有早期版本。

当 JVM 加载一个类时,它会检查字节码版本,如果它大于 JVM 最新理解的版本,你会得到一个错误。(ClassVersionError 什么的)。

于 2011-01-14T15:38:48.270 回答
7

Java (VM) 是向后兼容的。由 java 1.4.2 构建的代码将在 1.5 和 6 个 VM 上运行。JDK 编译器不向后兼容。所以代码不能被 java 1.5 编译以在 1.4.2 上运行。

于 2011-01-14T15:32:53.560 回答
3

JDK 向后兼容,即符合 1.4.2 规范的字节码将在 Java 5 JVM 上运行

于 2011-01-14T15:30:24.390 回答
1

根据 wiki 的定义,JDK 向下兼容。

于 2011-01-14T15:28:21.247 回答
1

它应该是向后兼容的。

于 2011-01-14T15:28:59.680 回答
-2

jdk 向上兼容 - 新版本可以在旧版本上运行

于 2011-01-14T15:29:27.587 回答