Java ist eine objektorientierte Programmiersprache, die zwar von Grund auf auf dem Begriff der Klasse basiert, aber dennoch pragmatisch bleibt. In Java gibt es daher eingebaute Datentypen, die auf dem Stack gehalten werden. Auch entfernt sich Java nicht weit von der C-Syntax. Hinsichtlich der Vererbung bietet Java gegenüber C++ nicht viel Neues.
Java ist pragmatisch objektorientiert.
Insgesamt ist Java eine vollwertige Programmiersprache, die alles bietet, was zur Entwicklung von mächtigen Applikationen notwendig ist. Die mitgelieferten Bibliotheken sind mehr als umfangreich. Die Ausführungsgeschwindigkeit ist auf dem Niveau von C-Code.
Interessanter ist, was in Java weggelassen wurde. Am auffälligsten ist wohl der Verzicht auf mehrfache Vererbung. So praktisch diese auch wäre, sie passt nicht in das Konzept einer einfachen Implementation. Die Interfaces bieten für die allermeisten Zwecke einen vollwertigen Ersatz. In seltenen Fällen würde sich der Code einfacher darstellen, wenn mehrfache Vererbung möglich wäre.
Weggelassen wurde auch Verwaltung des Heaps durch die Anwendung. Java verwendet dazu einen Garbage-Collector, der unbenutzte Elemente vom Heap entfernt und als Prozess im Hintergrund läuft. Natürlich sind Fälle denkbar, in denen dieser Prozess mit seiner Arbeit nicht nachkommt. Auch kann seine Arbeit das Zeitverhalten einer Java-Anwendung beeinflussen. Auf der anderen Seite vermeidet er viele Probleme, die sich in C++ durch zur Unzeit freigegebenen Speicher ergeben. Jeder C++-Programmierer hat da wohl schon einmal Erfahrungen gemacht. In Fällen, in denen sehr viele Objekte in sehr kurzer Zeit erzeugt und verworfen werden, ist es in Java aber ratsam, an die Wiederverwendung von Objekten zu denken.
Oft bemängelt wird das Fehlen der Möglichkeit, Operatoren zu überladen. Klar ist, dass es sich hier um eine reine Schreibvereinfachung handelt (syntactic sugar). Ich als Mathematiker würde Operatoren hin und wieder der funktionalen Schreibweise vorziehen. Aber essentiell ist das nicht. Führt man zusätzlich automatische Typumwandlungen ein, so kann das im Desaster enden.
Java war zu Beginn auf die Ausführung in einer beschränkten Umgebungen (Sandbox) ausgerichtet. Dies war auch notwendig, da damals das Applet, also ein im Browser lauffähiges Programm, im Zentrum stand. Leider wurde diese Funktionalität in Browsern zugunsten von Javascript (AJAX) aufgegeben, was heute von allen Browsern nativ unterstützt wird und daher von den Browserherstellern selber überwacht wird. Nach dem Verkauf von Java an Oracle und dem Konkurrenz-Java von Microsoft war das Misstrauten in Java zu groß. Inzwischen kann man Applets in Browsern praktisch nicht mehr ausführen. Java-Applikationen werden nun lokal auf den Rechner geladen und dort ausgeführt, oder direkt auf dem Server.
Keines der wichtigen Betriebssystem bietet Sicherheit.
Man muss sich vor Augen halten, dass keines der verbreiteten Betriebssysteme irgendetwas zu Sandboxen Vergleichbares aufweist. Seit Windows NT lassen sich zwar Datenbereiche und der Zugriff auf den Rechner schützen, aber in der Praxis lässt sich das System von jedem Programm zerstören. Außerdem schützen die wenigsten Benutzer ihre Daten tatsächlich. Die Unix-Varianten schützen System und Benutzer effektiv voreinander; aber jedes Programm kann über das Netzwerk Außenkontakte aufnehmen und sämtliche Daten des Benutzers, von dem es gestartet wurde, lesen und beschreiben. Eine wirklich sinnvolle und automatische Beschränkung eines laufenden Programms auf zugewiesene Verzeichnisse und freigegebene Ressourcen versprach seinerzeit nur Java.
Inzwischen gibt es Open-Source Alternativen für die Java-Runtime von Oracle. Dies bietet zumindest eine gewisse Sicherheit gegen in Java selbst liegende Schwachstellen.
Dieses Thema wurde hitzig diskutiert. In der Tat waren die ersten Versionen von Java langsam und warfen den Rechner um etwa 5 Jahre zurück (Faktor 8). Außerdem gab es Bugs und andere Unzulänglichkeiten.
Mit dem Erscheinen der Version 1.1.x von Java und der Fertigstellung der ersten stabilen JIT-Compiler (just in time compiler) änderte sich die Sachlage. Diese Compiler übersetzen den Bytecode beim Laden in Maschinensprache und beschleunigen dadurch die Programmausführung. Inzwischen ist Geschwindigkeit für mich kein Thema mehr. Vergleiche ergeben, dass sich Java mit C messen kann. Die viel verwendete Skriptsprache Python ist jedenfalls derzeit noch um den Faktor 10 langsamer.
Java ist für alle normalen Anwendungen schnell genug..
Eine der Träume von Sun beim Design von Java war es, Java auf kleinen, mäßig ausgerüsteten Computern laufen zu lassen. Diese Computer sollten ihre Anwendungen nicht lokal installieren, sondern die benötigten Klassen bei Bedarf von Netz laden. Es handelt sich praktisch um ein fortgeschrittenes Pendant zu den alten Terminals. Durch das Netzwerk stünden diesen Terminals dennoch die gesamten Ressourcen des Netzes zur Verfügung.
Der Vorteil wäre natürlich, dass diese Anwendungen auch nur zentral gewartet werden müssen. In der Tat ist nicht zu leugnen, dass die Wartung und Installation von Anwendungen auf jedem einzelnen Arbeitsplatz ein teurer Posten ist. Die Idee ist also, diese Kosten (total cost of ownership) dadurch zu senken, dass man genormte und billige Java-Maschinen anschafft, und die eigentliche Administration nur noch zentral tätig ist. Der Rechner wird ins Netz gesteckt und funktioniert sofort als vollwertiger Teil des Netzes.
Mit Java lässt sich der perfekte Netzwerkrechner verwirklichen.
Leider wird dieser Traum nicht Wirklichkeit werden, da er den Marktrealitäten entgegenläuft. Stattdessen gibt es immer mehr kleine Systeme, auf denen eine spezielle Version von Java läuft. Dazu gehören sogar schon Smartphones.
Android Anwendungen werden vollständig in Java entwickelt.
Dass auch auf dem Server Java ein guter Ersatz für die bisher verwendeten Skripten sein kann, setzt sich mehr und mehr durch. Bisher startet der Server bei einer Anfrage eines Benutzers ein kleines Programm (Skript), das in einer Kommandozeilensprache oder in einer einfachen Sprache wie Perl arbeitete. Java ist nun aber durch seine Netzwerkfähigkeit und seinen Sprachumfang hervorragend dazu geeignet, diese Sprachen zu ersetzen. Falls der Server selber in Java arbeitet, so kann er sogar einzelne Klassen dynamisch nachladen um damit auf Anfragen zu antworten (so genannte Servlets).
Leider wird Java immer weniger als Programmiersprache eingesetzt. Die große Ausnahme sind natürlich Android-Apps, und für Spezialisten die Web-Programmierung von Servern. Aber auf dem Desktop tut sich wenig. Der Grund ist ein Misstrauen, das insbesondere von Linux-Powerusern gestreut wurde. Angesichts der Java-Protagonisten Microsoft und Oracle ist das verständlich. Microsoft hat inzwischen auch noch seine Java-Version zugunsten von C# aufgeben.
Nach meiner persönlichen Einschätzung ist Java immer noch sehr gut geeignet, plattform-unabhängige und mächtige Applikationen zu erstellen. Solange allerdings der akademische Bereich sich sperrt, werden wir Java-Anwendungen, bis auf Android-Apps, immer weniger sehen.