Unterschiede zwischen Java und C/C++
von Laura Lemay
Dieser Anhang enthält eine Beschreibung der wichtigsten Unterschiede zwischen C, C++ und Java. Falls Sie Programmierer und mit C oder C++ vertraut sind, ist dieser Anhang für Sie besonders interessant, um einige Irrtümer, die häufig gerade Programmierern unterlaufen, wenn sie die Java-Sprache benutzen, zu vermeiden.
Java hat keinen expliziten Pointer-Typ. Anstelle von Pointern wird auf Objekte, auch Variablenzuweisungen, an Methoden weitergegebene Argumente und Array-Elemente, durch implizite Referenzen verwiesen. Referenzen und Pointer sind im wesentlichen das gleiche, außer daß man auf Referenzen keine Pointer-Arithmetik anwenden kann (und auch nicht muß).
Die Semantik von Referenzen ermöglicht in Java auch das einfache Erstellen von Strukturen wie verknüpfte Listen ohne explizite Pointer. Vielmehr wird lediglich ein verknüpfter Listenknoten mit Variablen, die auf den nächsten und vorherigen Knoten zeigen, erstellt. Um dann Elemente in die Liste einzufügen, werden diese Variablen anderen Knotenobjekten zugewiesen.
Arrays sind in Java vor allem Klassenobjekte. Referenzen auf Arrays und ihre Inhalte werden nicht durch Pointer-Arithmetik, sondern durch explizite Referenzen realisiert. Die Array-Grenzen werden streng eingehalten. Ein Versuch, über das Ende eines Arrays hinaus zu lesen, führt zu einem Kompilier- oder Laufzeitfehler. Wie bei anderen Objekten wird durch Weitergabe eines Arrays an eine Methode eine Referenz auf das Original-Array erzeugt. Wird der Inhalt der Array-Referenz geändert, ändert sich auch das Objekt des Original-Arrays.
Objekt-Arrays sind Referenz-Arrays, die nicht automatisch mit Objekten als Inhalt initialisiert werden. Der folgende Java-Code produziert z. B. ein Array vom Typ MyObject mit zehn Elementen, jedoch enthält dieses Array anfänglich nur Hex-Nullen:
MyObject arrayofobjs[] = new MyObject[10];
Nun müssen im Array die eigentlichen MyObject-Objekte hinzugefügt werden:
for (int i; i< arrayofobjs.length. i++) { arrayofobjs[i] = new MyObject();
Java unterstützt keine multidimensionalen Arrays wie C und C++. In Java müssen Arrays erstellt werden, die andere Arrays enthalten.
Strings sind in C und C++ Zeichenketten, die mit einem Nullzeichen (\0) enden. Strings werden genauso behandelt wie andere Arrays, mit allen innewohnenden Schwierigkeiten, d. h. die Pointer-Arithmetik zu verfolgen und das Ende des Arrays nicht zu überschreiten.
In Java sind Strings Objekte und alle Methoden, die auf Strings angewandt werden, können das String als komplette Einheit behandeln. Strings werden nicht durch eine Null beendet und das Ende eines Strings kann nicht versehentlich überschritten werden (wie bei Arrays werden die String-Grenzen streng eingehalten).
In Java ist das gesamte Speichermanagement automatisch. Speicher wird beim Erstellen eines Objekts automatisch zugewiesen. Ein Laufzeitpapierkorb (»Garbage-Collector«) gibt den jeweils zugewiesenen Speicher wieder frei, wenn das Objekt nicht mehr benutzt wird. Die Funktionen malloc und free von C existieren in Java nicht.
Um die Freigabe des von einem Objekt belegten Speichers zu erzwingen, werden alle Referenzen auf das Objekt entfernt (Zuweisung von Variablen, die es auf Null halten, Entfernen des Objekts von Arrays usw.). Bei der nächsten Ausführung fordert der Java-Papierkorb den zugeteilten Speicher zurück.
Wie am Anfang dieses Buches erwähnt, haben alle primitiven Datentypen (char, int, long usw.) in Java auf allen Plattformen und unter allen Betriebssystemen feste Größen und Eigenschaften. Die in C und C++ bekannten vorzeichenlosen Datentypen gibt es nicht (außer char, der eine vorzeichenlose 16-Bit-Ganzzahl ist).
Die booleschen primitiven Datentypen können zwei Werte haben: true oder false. Der boolesche Datentyp ist keine Ganzzahl und kann auch nicht als solche behandelt werden, obwohl in Java auf boolesche Typen keine 0 oder 1 (Ganzzahlen) abgebildet werden können.
Die Zusammensetzung von Datentypen wird in Java ausschließlich durch Verwendung von Klassendefinitionen erreicht. Die Schlüsselwörter struct, union und typedef wurden zugunsten von Klassen weggelassen.
Die Umwandlung von Datentypen in andere Datentypen ist in Java stärker kontrolliert. Automatisch wird nur umgewandelt, wenn kein Risiko eines Informationsverlustes besteht. Alle anderen Umwandlungen müssen explizit angefordert werden. Die primitiven Datentypen (int, float, long, char, boolean usw.) können nicht in Objekte - und umgekehrt - umgewandelt werden. In Java gibt es Methoden und spezielle »Wrapper«-Klassen, um Werte zwischen Objekten und Primitivtypen zu konvertieren.
Die Präzedenz und Assoziation von Operatoren ist in Java genauso wie in C. Allerdings bindet das neue Schlüsselwort (zum Erstellen eines neuen Objekts) straffer als die Punkt-Notation (.), die sich anders verhält als in C++. Beachten Sie folgenden Ausdruck:
new foo().bar;
Er funktioniert so, als ob er wie folgt geschrieben worden wäre:
(new foo()).bar;
Im Gegensatz zu C++ können in Java keine Operatoren überladen werden. Der C-Operator »,« wird nicht verwendet.
Der Operator »>>>« produziert eine vorzeichenlose logische Verschiebung nach rechts (wie Sie wissen, gibt es in Java keine vorzeichenlosen Datentypen).
Der Operator »+« kann zum Verketten von Strings benutzt werden.
Obwohl die Anweisungen if, while, for und do in Java syntaktisch gleich sind wie in C und C++, gibt es einen entscheidenden Unterschied. Das Testkriterium für jedes Entscheidungsgebilde muß einen tatsächlichen booleschen Wert (true oder false) ausgeben. In C und C++ kann der Ausdruck eine Ganzzahl ausgeben.
Java unterstützt keine Mechanismen für wahlweise Argumente oder Argumentlisten mit variabler Länge für Funktionen wie in C und C++. Alle Methodendefinitionen müssen eine spezifische Anzahl von Argumenten haben.
Befehlszeilenargumente verhalten sich in Java anders als in C und C++. Das erste Element im Argumentenvektor (argv[0]) ist in C und C++ der Name des Programms. In Java ist das erste Argument das erste der zusätzlichen Argumente. Mit anderen Worten, argv[0] in Java entspricht argv[1] in C und C++. Es gibt keine Möglichkeit, den Namen des Java-Programms hier einzubinden.
Nachfolgend ein paar kleinere Unterschiede zwischen Java und C bzw. C++:
Java hat keinen Vorprozessor und damit kein #defines und keine Makros. Konstanten können erstellt werden, indem der endgültige Modifier beim Deklarieren von Klassen- und Instanzvariablen verwendet wird.
Das Schlüsselwort goto existiert in Java nicht (d. h. es ist ein reserviertes Wort, das derzeit nicht benutzt wird). Andererseits können aber die Sprungbefehle break und continue benutzt werden, um die Ausführung komplexer Schalt- oder Schleifengebilde zu unterbrechen und fortzusetzen.
Copyright ©1996 Markt&Technik