Warum Java lernen?

Plattformunabhängigkeit

Write once, run anywhere1)

Alle Java-Programme werden in der JVM2) ausgeführt. Das hat den Vorteil, dass man Java-Programme auf jeder Plattform auf der eine JVM verfügbar ist ohne Änderungen oder Neukompilierung ausführen kann. Die verwendeten Bibliotheken müssen natürlich vorhanden sein.

Eine JVM gibt es für alle wichtigen Systeme. Beispiele (auf keinen Fall vollständige Aufzählung):

  • Linux
  • BSD
  • Windows
  • Mac OS
  • Solaris
  • Symbian
  • Android

Automatische Speicherverwaltung

In Java muss der Entwickler sich nicht direkt um die Speicherverwaltung, also das anfordern und freigeben der einzelnen Speicherbereiche, kümmern. Instanziert man ein Objekt, so wird vom Laufzeitsystem automatisch der benötigte Speicher bereitgestellt. Freigegeben wird der Speicher vom Garbage Collector.

Der Garbage Collector schaut nach einer unbestimmten Zeit oder wenn kein freier Speicher mehr verfügbar ist auf den Speicher und gibt alles frei, was nicht mehr referenziert wird. Denn existiert keine Referenz mehr auf den Speicherbereich, so kann man diesen auch nicht mehr benutzen.

Objektorientiert

Java unterstützt die Objektorienterte Programmierung. Jeder Code in Java ist in Klassen organisiert und fast alle Elemente eines Programmes sind eigentlich Objekte. Die einzige Ausnahme, sind die primitiven Datentypen.

Standardbibliothek

Java bietet im Standard bereits eine sehr umfangreiche Bibliothek, ohne dass irgendwelche externen Dinge heruntergeladen, installiert, eingerichtet und geladen werden müssen.

Mit den im Standard enthaltenen Funktionen sind wir bereits für sehr viele Herausforderungen bzw. Projekte gerüstet.

Im folgenden noch zwei Beispiele für Funktionalitäten, die bei anderen Sprachen erst durch externe Bibliotheken (oder Eigenentwicklung) verfügbar sind.

GUI (AWT, Swing)

Die meisten Programme haben heute eine grafische Benutzeroberfläche 3). Bei vielen Sprachen sind Funktionen zur GUI-Programmierung nicht im Standard verankert und müssen erst durch externen Bibliotheken hinzugefügt werden.

Java bietet sogar gleich zwei Toolkits 4) zur grafischen Programmierung.

  • AWT 5) ist ein etwas älteres Framework, das die Betriebssystem-Funktionen zur grafischen Programmierung nutzt. Es ist deshalb etwas schneller aber bietet dafür nicht so viele Funktionen wie die alternative.
  • Swing ist wohl das verbreitetste Framework zur GUI-Programmierung unter Java. Es bietet sehr viele Funktionen und Gestaltungsmöglichkeiten.

Multithreading

Benutzung von mehreren Kernen des Hauptprozessors und parallele Verarbeitung von Programmen oder Programmteilen sind immer mehr ein Thema in der Softwareentwicklung. Auch hierfür bietet Java Funktionen im Standard an um solche Anforderungen umzusetzen.

Dokumentation

Es gibt eine ausführliche Java Dokumentation, die alle Bestandteile der Standardbibliothek und des Sprachkerns abdeckt.

Hier kann man bei Unklarheiten nachforschen oder eine bestimmte Funktion suchen. Außerdem lohnt es sich hin und wieder ein wenig in der Dokumentation zu stöbern, wenn man die Grundlagen von Java beherrscht.

Außerdem gibt es im JDK das Dokumentationswerkzeug Javadoc, das aus Java-Quelltexten automatisch eine HTML-Dokumentation im Stile der Java Dokumentation erstellt.

Community

Da Java sehr weit verbreitet ist (siehe Popularität) hat sich rund um die Java Programmierung eine große Community entwickelt. Der Vorteil daran ist, dass man bei einem Problem oder einer Frage eigentlich immer recht schnell jemanden findet, der das Problem selber bereits hatte oder der einem helfen kann.

Hier noch ein paar Links:

Außerdem gibt es in den meisten Communities zum Thema Programmierung auch eine Java Abteilung.

Popularität

Vorallem in den Bereichen Web-, Business- und Mobile- Anwendungen ist Java sehr weit verbreitet. Im mobilen Bereich sind auch Spiele ein großes Thema.

Außerdem wird Java von mehreren großen Firmen eingesetzt, die sich auch an der Weiterentwicklung der Sprache und des Systems beteiligen.

  • Oracle (Hat mit der Übernahme von SUN auch Java übernommen)
  • IBM (Eclipse, SWT, …)
  • Apache (etliche Java EE Implementierungen etc.)
  • Google (Android)

Auf den verschiedenen Programmiersprachen Ranking Seiten ist Java auch überall ganz vorne mit dabei:

Red Monk Programming Lanuage Rankings

Transparent Language Popularity Index

Programming Language Popularity

TIOBE Index

Anwendungsbeispiele

Java ist sehr oft die Sprache der Wahl, wenn es um Web-Anwendungen im Business Bereich geht. Aber nicht nur hier trifft man auf Java. Im folgenden zeige ich noch einige andere Beispiele.

Desktopanwendungen

  • Lotus Notes
  • Eclipse
  • Netbeans
  • OpenOffice und LibreOffice
  • JDownloader

Spiele

  • Minecraft
  • unzählige Handy (Symbian), Smartphone und Tabletspiele (Android)

Firmen die Java einsetzen

  • Apache Software Foundation
  • Oracle Corporation
  • SAP Aktiengesellschaft
  • International Business Machines Corporation (IBM)
  • Google Inc.

Nachteile von Java

Es gibt auch einige Nachteile an Java, die hier der Vollständigkeit halber nicht unerwähnt bleiben sollen. Die meisten ergeben sich aus den vorher aufgelisteten Vorteile.

Echtzeitanwendungen

Für Echtzeitanwendungen (Steuerung eines Atomkraftwerks zum Beispiel) kann Java nicht verwendet werden, da durch die Ausführung in der JVM und die automatische Speicherbereinigung (Garbage Collector) nicht gewährleistet werden kann, dass eine bestimmte Funktion zu einer bestimmten Zeit abgeschlossen ist.

Man stelle sich einmal vor ein zeitkritischer Prozess beim herunterkühlen des Kernreaktors wird um ein oder zwei Sekunden hinausgezögert, weil der Garbage Collector meint jetzt einmal kurz den Speicher aufräumen zu müssen. Man muss kein Atomwissenschaftler sein um die möglichen Konsequenzen erahnen zu können.

Performance

Wie wir bereits wissen, wird Java Quellcode nicht direkt in Maschinencode sondern zu Bytecode umgewandelt. Da der Bytecode von einem handelsüblichen Hauptprozessor nicht verarbeitet werden kann und dieser in der JVM ausgeführt wird (was wiederum nur ein Prozess auf dem wirklichen Hauptprozessor ist), kann man sich leicht vorstellen, dass die Performance meist nicht ganz so gut wie bei nativ kompilierenden Sprachen wie etwa C oder C++ ist.

Dieser Nachteil macht sich allerdings erst bei sehr performancekritischen Anwendungen bemerkbar.

Systemspezifisch

Da Java Proramme nicht direkt auf dem Hauptprozessor und im eigentlichen Betriebssystem des Computers ausgeführt werden, hat man auch keinen direkten Zugriff auf systemspezifische Funktionen (zum Beispiel Kernel-Funktionen).

Diesen Umstand kann man umgehen, wenn man die benötigten Funktionen auslagert und mittels JNI 6) in Java aufruft. Dazu muss man die systemspezifischen Aufrufe in einer nativ kompilierenden Sprache (zum Beispiel C oder C++) kapseln. Dadurch verliert man aber natürlich den Vorteil der Plattformunabhängigkeit, weil man diese Funktionen für jedes System in dem das Programm lauffähig sein soll auch bereitstellen muss.

Low-Level

Bei Java kann man nicht direkt auf Speicherbereiche zugreifen. Außerdem hat der Entwickler keinen direkten Einfluss auf die Speicherverwaltung (also das anfordern und freigeben von Speicher). Dazu fehlt auch noch die Möglichkeit mit Zeigern zu rechnen (Pointer Arithmetik).

Diese Eigenschaften machen Java unbrauchbar für Low-Level Entwicklung (wie zum Beispiel Treiberentwicklung oder die Entwicklung eines Betriebssystem Kernels).

Allerdings kann man Low-Level Funktionen auslagern und in einer nativ kompilierenden Sprache (zum Beispiel C oder C++) schreiben und dann in Java aufrufen. (Stichwort JNI 7))

Freiheit

Manche Entwickler finden es nicht gut, dass man beim Design von Java bestimmte Features bewusst nicht implementiert hat.

Die Java-Designer hatten damit beabsichtigt die Sprache nicht unnötig kompliziert zu machen, jedoch ist bei dieser Entscheidung auch ein wenig gefühlte Freiheit verloren gegangen.

Features die speziell C++ Entwickler vermissen könnten sind zum Beispiel:

  • Mehrfachvererbung
  • Operatorüberladung
  • Const Correctness
  • Template Programmierung
  • Pointer Arithmetik
  • C++ Referenzen
  • Sprungbefehl (goto)
1)
Ein von Sun Microsystems erfundener Werbespruch, um die Plattformunabhängigkeit von Java anzupreisen
2)
Java Virtual Machine, eine virtuelle Maschine die Java-Bytecode ausführt
3)
Graphical User Interface, abgekürzt GUI
4)
deutsch Werkzeugkästen
5)
Abstract Window Toolkit
6) , 7)
Java Native Interface