2012-04-03 6 views
7

Hat Java während der Entwicklung immer die Rückwärtskompatibilität des Quellcodes beibehalten?Hat die Java-Sprache während des gesamten Verlaufs die Rückwärtskompatibilität des Quellcodes aufrechterhalten?

Genauer gesagt: gegeben zwei Java-Versionen X und Y mit X < Y, ist jedes Programm für Java X auch ein gültiges Programm für Java Y, mit der gleichen Semantik? Zum Beispiel X = Java 2 (oder 1.2 mit der alten Nummerierung) und Y = Java 5.

Oder gibt es nur Kompatibilität auf der JVM-Ebene: z. Eine für die JVM 1.2 kompilierte Klasse kann von der JVM 5 ausgeführt werden?

Wenn es möglich ist, Java 2-Code auf einem Java 5 (oder 6 oder 7) auszuführen, was sind die genauen Schritte, denen ich folgen muss? Kompiliere direkt mit einem Java 5 Compiler? Kompiliere mit einem Java 2 Compiler und laufe auf JVM 5?

+1

Danke für die schnellen Antworten. Ich war mir nicht ganz sicher, welche ich akzeptieren sollte, weil mehrere Antworten informativ waren. Ich musste eins auswählen. – Giorgio

Antwort

4

Sun, und jetzt Oracle, waren immer sehr vorsichtig mit Rückwärtskompatibilität in Bezug auf Java.

Binärkompatibilität: Sie sollten Java-Code, der mit älteren Versionen kompiliert wurde, in neueren Versionen ohne Änderung ausführen können. Es könnte jedoch kleine Inkompatibilitäten geben.

Quellkompatibilität: Code, der ursprünglich für eine ältere JDK-Version geschrieben wurde, sollte fast immer ohne Änderung mit einem neueren Java-Compiler kompiliert werden, aber es gibt eine Reihe kleiner Inkompatibilitäten. Eine davon ist das in Java 5 hinzugefügte Schlüsselwort enum; Bei älteren Versionen von Java war enum ein gültiger Bezeichner, aber nicht auf Java 5. Außerdem wurde das Importieren von Klassen aus dem Standardpaket entfernt (ich denke seit Java 1.4). So können Sie nicht tun:

import SomeClassName; 

mehr auf Java 1.4 oder neuer.

In der Dokumentation jeder JDK-Version gibt es ein Dokument über die Abwärtskompatibilität mit früheren Versionen, in dem die Details aufgeführt sind.

4

Starten mit Java 1.5 enum wurde ein reserviertes Wort. Daher wurde jeder Java 1.4-Quellcode, der enum enthält, beginnend mit 1.5

+2

Dasselbe passierte mit "assert" in 1.4. Es gibt wahrscheinlich auch andere Beispiele. – Taymon

2

gebrochen. Sie können immer mit einer neueren Version des JDK dann die für die Kompilierung verwendete ausführen. Anders herum ist das nicht möglich (außer Sie kompilieren mit dem Parameter -target).

Sie könnten this document (insbesondere die Querübersetzbarkeit Optionen Abschnitt) lesen möchten, die den Zielparameter und das Standardverhalten erklärt

3

Soweit ich weiß, JVMs sind rückwärtskompatibel. Eine mit JDK 1 kompilierte Klasse funktioniert in der aktuellen JRE 7. Die Libraires sind definitiv nicht 100% kompatibel. Einige Methoden wurden eingestellt (und anschließend entfernt). Einige Klassen haben das Verhalten auf (normalerweise) subtilen Wegen verändert, was dazu führt, dass sich Programme anders verhalten.

+0

Gibt es etwas, das vollständig entfernt wurde? Ich weiß, dass sie Dinge gerne ablehnen, aber ich kann mir nichts vorstellen, was wirklich herausgenommen wurde. – cHao

+0

Ja :) http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/FontMetrics.html#getDescent() In JDK 1 und vielleicht 1.1 wurde diese Methode versehentlich "getDecent" genannt . Es wurde dann veraltet und schließlich entfernt :) –

+0

(zu denken, ich habe nicht überprüft, dass es entfernt wird, vielleicht ist es immer noch da ...) –

0

Java ist in der Regel mit früheren Versionen kompatibel, aber trotzdem kann es viel f Probleme mit der Migration sein. Siehe meinen Artikel über migration from JDK 6 to 8 Details

Verwandte Themen