Java语言是否在其历史记录中保持源代码向后兼容性?

时间:2012-04-03 19:21:07

标签: java backwards-compatibility

Java在开发过程中是否始终保持源代码向后兼容性?

更准确地说:给定两个Java版本X和Y,其中X< Y,Java X的任何程序也是Java Y的有效程序,具有相同的语义吗? 例如。 X = Java 2(或旧的编号为1.2),Y = Java 5.

或者只有JVM级别的兼容性:例如为JVM 1.2编译的类可以由JVM 5运行吗?

如果可以在Java 5(或6或7)上运行Java 2代码,那么我必须遵循哪些具体步骤?直接使用Java 5编译器编译?使用Java 2编译器编译并在JVM 5上运行?

6 个答案:

答案 0 :(得分:4)

从Java 1.5开始enum成为保留字。因此,任何包含enum的Java 1.4源代码都以1.5

开始被破坏

答案 1 :(得分:4)

Sun,现在是Oracle,对于Java的向后兼容性一直非常小心。

二进制兼容性:您应该能够在没有修改的情况下在较新版本上运行使用旧版本编译的Java代码。但是,可能存在小的不兼容性。

源兼容性:最初为较旧的JDK版本编写的代码几乎总是在不使用较新的Java编译器进行修改的情况下编译,但存在许多小的不兼容性。其中之一是Java 5中添加的enum关键字;在旧版本的Java上,enum是一个有效的标识符,但在Java 5上却没有。此外,从默认包中导入类已被删除(我认为自Java 1.4以来)。所以你不能这样做:

import SomeClassName;

再用Java 1.4或更新版本。

在每个JDK版本的文档中都有一个关于与以前版本向后兼容的文档,其中列出了详细信息。

答案 2 :(得分:3)

据我所知,JVM向后兼容。使用JDK 1编译的类将在最新的JRE 7中使用。 图书馆绝对不是100%兼容的。某些方法已被弃用(随后被删除)。有些类以(通常)微妙的方式改变行为,这将导致程序的行为不同。

答案 3 :(得分:2)

您始终可以使用较新版本的JDK运行,然后运行用于编译的版本。反过来是不可能的(除非你使用-target参数进行编译)。

您可能需要阅读this document(特别是交叉编译选项部分),它解释了目标参数和默认行为

答案 4 :(得分:1)

您可以在此处查看Java(Jre)库类的向后兼容性分析:http://abi-laboratory.pro/java/tracker/timeline/jre/

该报告由 japi-compliance-checker 工具生成。

enter image description here

答案 5 :(得分:0)

Java通常与以前的版本兼容,但无论如何,迁移可能存在很多问题。 有关详细信息,请参阅我的文章migration from JDK 6 to 8