Wikipedia · einfach zusammengefasst · Stand
Java (Programmiersprache)
Java ist eine objektorientierte Programmiersprache und eine eingetragene Marke des Unternehmens Sun Microsystems, welches 2010 von Oracle übernommen wurde.
Inhalt6 Abschnitte
Java und die Java-Technologie
Java ist eine objektorientierte, stark und statisch typisierte Programmiersprache. Sie erschien 1995; als Designer werden James Gosling und Sun Microsystems genannt. Sun wurde 2010 von Oracle übernommen. Die aktuelle Version ist Java SE 26 vom 17. März 2026. Java ist plattformunabhängig und steht unter der GNU General Public License.
Java als Sprache ist von der Java-Technologie zu unterscheiden. Zu dieser gehören das Java Development Kit (JDK) zum Erstellen von Programmen und die Java Runtime Environment (JRE) zu ihrer Ausführung. Die JRE umfasst die Java Virtual Machine (JVM) und mitgelieferte Bibliotheken. Programmierer schreiben zunächst menschenlesbaren Quellcode. Ein Java-Compiler übersetzt ihn in Java-Bytecode; die JVM führt diesen Bytecode aus. Bytecode kann auch aus anderen Sprachen wie Groovy, Kotlin oder Scala entstehen.
Die JVM ist normalerweise Software auf der jeweiligen Zielplattform, nicht die Hardware selbst. Dadurch soll derselbe Bytecode ohne Änderung auf verschiedenen Rechnerarchitekturen laufen, wenn eine passende Laufzeitumgebung vorhanden ist. Oracle bietet diese unter anderem für Linux, macOS und Windows an. Java wird außerdem in elektronischen Geräten wie Autos und HiFi-Anlagen verwendet. Für höhere Geschwindigkeit kann die JVM Bytecode zunächst interpretieren und häufig benötigte Teile anschließend zur Laufzeit kompilieren und optimieren, etwa durch Just-in-time-Kompilierung und Hotspot-Optimierung.
Java zählt zu den populärsten Programmiersprachen. Im seit 2001 veröffentlichten TIOBE-Index lag es bis 2020 zusammen mit C stets auf einem der ersten beiden Plätze. Seit 2021 steht dort Python vor C, C++ und Java. Der Java-Anteil sank von etwa 25 % im Jahr 2001 auf etwa 10 % in den Jahren 2021–2025.
Ziele und grundlegende Eigenschaften
Java sollte einfach, objektorientiert, verteilt und vertraut sowie robust, sicher, architekturneutral, portabel, leistungsfähig, interpretierbar, parallelisierbar und dynamisch sein.
Einfachheit bedeutet einen gegenüber C++ oder C# reduzierten Sprachumfang: Java unterstützt zum Beispiel weder Operatorüberladung noch Mehrfachvererbung. Die C++-ähnliche Syntax, die ursprüngliche Nähe der Klassenbibliothek zu Smalltalk und verwendete Entwurfsmuster erleichtern erfahrenen Programmierern den Umstieg.
Robustheit wird durch starke Typisierung, automatische Speicherbereinigung (Garbage Collection), Ausnahmebehandlung und den Verzicht auf Zeigerarithmetik gefördert. Der Class-Loader steuert die sichere Zuführung von Klasseninformationen zur JVM. Security-Manager sollen nur Zugriffe auf Programmobjekte erlauben, für die Rechte bestehen.
Architekturneutralität heißt, dass dieselbe Programmversion prinzipiell auf beliebiger Hardware laufen kann. Portabilität geht weiter: Elementare Datentypen sind in Größe, interner Darstellung und Rechenverhalten festgelegt. Ein float ist beispielsweise immer ein IEEE-754-Float mit 32 Bit Länge. Auch die Klassenbibliothek ermöglicht etwa betriebssystemunabhängige grafische Benutzeroberflächen.
Die Leistung kann durch Laufzeitoptimierung hoch sein, während die Laufzeitumgebung zugleich Overhead verursacht. Daher kann Java C++ in manchen Kontexten übertreffen, in anderen aber nicht erreichen. Java unterstützt Multithreading, also parallel ablaufende Programmteile. Die Schlüsselwörter synchronized und volatile unterstützen das „Monitor & Condition Variable Paradigma“ von C. A. R. Hoare; moderne JVMs ordnen Java-Threads Betriebssystem-Threads zu und nutzen mehrere Prozessorkerne. Weil Module erst zur Laufzeit gelinkt werden, können beispielsweise Bibliotheken ersetzt werden, ohne übrige Teile anzupassen. Interfaces können dabei die Kommunikation zwischen Modulen festlegen, während ihre Implementierung dynamisch geändert werden kann.
Objekte, Klassen und wichtige Sprachelemente
Bei der objektorientierten Programmierung werden Daten und die zugehörigen Funktionen in Objekten zusammengefasst und nach außen gekapselt; dies heißt Abstraktion. Das soll große Projekte besser verwaltbar machen, die Softwarequalität erhöhen und Module wiederverwendbar machen.
Java unterscheidet ausdrücklich Klassen (class) und Schnittstellen (interface). Eine Klasse hat genau eine Basisklasse, kann aber beliebig viele Schnittstellen implementieren. Schnittstellen geben Methodensignaturen und Standardimplementierungen weiter, aber keine Attribute. Es gibt keine direkte Mehrfachvererbung von Klassen, wohl aber Vererbung über mehrere Ebenen. Alle Klassen sind direkt oder indirekt von Object abgeleitet. Primitive Datentypen wie int und boolean sind keine Objekte; ab Java 5 werden sie bei Bedarf durch Autoboxing automatisch in passende Objekttypen und zurück umgewandelt.
Objektzugriffe sind intern über Referenzen umgesetzt. Sie ähneln Zeigern aus C oder C++, werden aber als „Reference Values“ per Call by value übergeben. Weder Speicheradressen noch deren Veränderung sind im Quelltext möglich; Zeigerarithmetik ist ausgeschlossen. Klassen werden in hierarchisch benannte Pakete (packages) gegliedert, meist mit umgekehrtem Internet-Domainnamen wie com.google. Pakete strukturieren Projekte, trennen Namensräume und begrenzen Sichtbarkeit. Klassennamen müssen nur innerhalb eines Pakets eindeutig sein; die Namenshierarchie hat keine semantische Bedeutung.
Java besitzt Threads, Ausnahmen und einen Garbage Collector, der nicht mehr referenzierte Objekte aus dem Speicher entfernt. Seine umfangreiche Klassenbibliothek bietet eine einheitliche, betriebssystemunabhängige API. Die Java Foundation Classes enthalten Swing für plattformunabhängige grafische Benutzeroberflächen, das auf dem Abstract Window Toolkit basiert.
Reflexion erlaubt über eine API, zur Laufzeit auf Klassen und Methoden zuzugreifen, die beim Erstellen eines Programms noch nicht genau bekannt waren, etwa bei der Fabrikmethode. Annotationen wurden mit Java 5 eingeführt. Sie sind Metadaten im Quellcode, können auch in Class-Dateien stehen und über Reflexion ausgelesen werden. Sie dienen unter anderem der automatischen Code- oder Dokumenterzeugung.
Syntax und Beispiel der Vererbung
Syntax, Grammatik und Semantik sind in der Java Language Specification dokumentiert. Ein einfaches Programm kann mit IO.println("Hallo Welt!"); die Meldung „Hallo Welt!“ mit Zeilenumbruch ausgeben.
Das Tier-Beispiel zeigt Vererbung und das Überschreiben von Methoden: Die Klasse Hund und die Klasse Katze erweitern die Oberklasse Tier. Beide überschreiben kommuniziere(), rufen darin mit super.kommuniziere() zunächst die Implementierung der Oberklasse auf und geben dann ihren eigenen Text aus. Eine Variable vom Typ Tier kann nacheinander ein neues Hund- und ein neues Katze-Objekt enthalten. Beim Aufruf tier.kommuniziere() wird jeweils die zur tatsächlichen Objektklasse passende Methode ausgeführt.
Die Konsolenausgabe lautet:
- Tier sagt nichts.
- Hund sagt: 'Wuff Wuff'
- Tier sagt nichts.
- Katze sagt: 'Miau'.
Weiterentwicklung und Abgrenzung
Die Java-Sprachspezifikation wird neben Oracle im Java Community Process (JCP) weiterentwickelt, an dem unter anderem Apple, IBM, Hewlett-Packard und Siemens beteiligt sind. Sun Microsystems gründete den JCP 1998. Teile von javac und der Hotspot Virtual Machine wurden am 13. November 2006 als Open Source veröffentlicht, große Teile des Java-SE-Quellcodes am 8. Mai 2007. OpenJDK koordiniert die Entwicklung. Für einzelnen Code besaß Sun keine Freigaberechte; er liegt nur kompiliert vor. Eine weitere große Implementierung aktueller Java-Releases ist Eclipse OpenJ9, dessen JVM unter EPL 2.0, Apache 2.0 und GNU 2.0 with Classpath Exception mehrfachlizenziert ist.
Java darf nicht mit JavaScript verwechselt werden. JavaScript ist dynamisch typisiert und objektbasiert; bis ECMAScript 2015 war es klassenlos. Es hat zwar teilweise ähnliche Syntax, unterscheidet sich aber stärker von Java als etwa C++ oder C#. Es wurde ursprünglich vor allem in HTML-Seiten eingesetzt und wird mit Node.js zunehmend für Server-Anwendungen verwendet.
Von Smalltalk übernahm Java den Klassenbaum mit java.lang.Object als Wurzelklasse, die virtuelle Maschine und die automatische Speicherbereinigung. Anders als Smalltalk besitzt Java primitive Datentypen. Gegenüber C++ fehlen unter anderem Mehrfachvererbung, Zeigerarithmetik und frei definierbare Operatorüberladung. Java 5 führte Generics ein, die typsichere Container ermöglichen, aber keine Metaprogrammierung wie C++-Templates. final ersetzt teilweise const: Eine finale Klasse kann nicht abgeleitet, ein finales Attribut nur einmal gesetzt und eine finale Methode nicht überschrieben werden.
C#/.NET wird als Konkurrenz zu Java beschrieben. Delegates in .NET entsprechen in ihrer Aufgabe etwa Funktionszeigern; Java kann Vergleichbares mit Methodenreferenzen oder Lambdaausdrücken umsetzen. Java kennt Checked Exceptions, die so deklariert werden können, dass sie verarbeitet werden müssen. Scala verbindet objektorientierte und funktionale Programmierung auf der JVM. Kotlin ist ebenfalls statisch typisiert, kann JVM-Bytecode, JavaScript-Quellcode oder mittels LLVM Maschinencode erzeugen und wird seit 2017 offiziell für Android unterstützt; seit Mai 2019 ist es Googles bevorzugte Sprache für die Android-Appentwicklung.
Anwendungen, Werkzeuge und Übersetzung
Java wird für verschiedene Anwendungsarten eingesetzt. Bei Webanwendungen läuft üblicherweise Geschäftslogik und Persistenz auf dem Webserver in Java, während die grafische Oberfläche im Browser meist HTML und JavaScript verwendet. Beispiele sind Twitter, Jira, Jenkins und Gmail, das zu großen Teilen in Java geschrieben ist. Desktop-Anwendungen sind normale PC-Programme wie Eclipse, Vuze oder Minecraft. Java-Applets liefen in einem begrenzten Bereich einer Webseite, benötigen einen Java-fähigen Browser und werden seit Java 11 nicht mehr unterstützt; schon in Java 9 waren sie als veraltet markiert. Mobile Apps können auf Java-ME-Plattformen laufen. Android-Apps können in Java geschrieben werden, verwenden aber eine abweichende Klassenbibliotheks-API.
Java-Entwicklungsumgebungen sind oft selbst in Java geschrieben. Bekannte freie Umgebungen sind Eclipse und NetBeans; zu den genannten kommerziellen Angeboten gehören IntelliJ IDEA, JBuilder und JCreator. Für Android wird Android Studio empfohlen, für Einsteiger BlueJ mit grafischen Klassendiagrammen.
Ein Bytecode-Compiler übersetzt .java-Quellcode normalerweise in nicht direkt ausführbare .class-Dateien. Die JRE führt sie aus. HotSpot kompiliert häufig genutzte Programmteile schrittweise zur Laufzeit in nativen Prozessorcode und optimiert sie; dadurch können Teile nach mehrmaliger Ausführung schneller werden. javac ist Teil des JDK. Native oder Ahead-of-time-Compiler erzeugen Maschinencode direkt aus Java-Quellcode oder Bytecode. Solche Programme benötigen keine JavaVM mehr, verlieren aber die Plattformunabhängigkeit. Wrapper verpacken Java-Programme in eine äußere Hülle, suchen eine vorhandene Laufzeitumgebung und geben sonst eine verständliche Meldung aus. Java Web Start ermöglichte den Start per Mausklick sowie automatisierte Installationen und Aktualisierungen.