为了账号安全,请及时绑定邮箱和手机立即绑定

JDK是“向上”还是“向后”兼容?

JDK是“向上”还是“向后”兼容?

动漫人物 2019-11-30 14:31:58
向后二进制兼容性(或向下兼容性)-使用旧版本的库API构建的客户端可以在新版本上运行的能力(wiki)。向上二进制兼容性(或向前兼容性)-使用新版本的库API构建的客户端可以在旧版本上运行的能力(wiki)。从1.4.2开始, Sun关于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是“向上”还是“向后”兼容?
查看完整描述

3 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

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

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

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

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

简而言之,我们可以说:

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

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

(这也是一个应该在很久以前学习的课程:编写编译器的人通常是正确的,而我们使用它们的人是错误的xD)

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


查看完整回答
反对 回复 2019-11-30
?
慕码人8056858

TA贡献1803条经验 获得超6个赞

扩展答案以包括最新的Java…


Java SE 7和JDK 7的兼容性

Oracle的未注明日期页面的引言:


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


源:源兼容性涉及将Java源代码转换为类文件,包括代码是否仍在编译。

二进制:二进制兼容性在Java语言规范中定义为保留无错误链接的能力。

行为:行为兼容性包括在运行时执行的代码的语义。

…和


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不兼容


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


查看完整回答
反对 回复 2019-11-30
?
温温酱

TA贡献1752条经验 获得超4个赞

仅向后。前向兼容(“优雅地接受打算供其自身更高版本使用的输入”)将要求1.5 JVM能够运行1.6编译的代码,而这不能。

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

JDK / JRE的每个发行版都与Java字节码的版本一致。每个编译器都会生成特定字节码版本的代码。每个JVM都了解特定字节码版本的版本和所有较早版本。

当JVM加载一个类时,它会检查字节码版本,如果它大于JVM最新理解的版本,则会收到错误消息。(ClassVersionError之类的)。


查看完整回答
反对 回复 2019-11-30
  • 3 回答
  • 0 关注
  • 1515 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信