3 回答
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)
顺便说一句,将向后/向前和向下/向上配对而不是将它们混合起来更有意义吗?
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不兼容
(那里没有序言–只是不兼容的列表。)
TA贡献1752条经验 获得超4个赞
仅向后。前向兼容(“优雅地接受打算供其自身更高版本使用的输入”)将要求1.5 JVM能够运行1.6编译的代码,而这不能。
向后要求“如果它可以使用较旧设备生成的输入”,这是正确的,因为1.6 JVM可以运行1.5编译代码。
JDK / JRE的每个发行版都与Java字节码的版本一致。每个编译器都会生成特定字节码版本的代码。每个JVM都了解特定字节码版本的版本和所有较早版本。
当JVM加载一个类时,它会检查字节码版本,如果它大于JVM最新理解的版本,则会收到错误消息。(ClassVersionError之类的)。
添加回答
举报