Java ist eineobjektorientierteProgrammiersprache und eine eingetrageneMarke des UnternehmensSun Microsystems, welches 2010 vonOracleübernommen wurde. Die Programmiersprache ist ein Bestandteil derJava-Technologie – diese besteht grundsätzlich aus dem Java-Entwicklungswerkzeug (JDK) zum Erstellen von Java-Programmen und derJava-Laufzeitumgebung (JRE) zu deren Ausführung. Die Laufzeitumgebung selbst umfasst die virtuelle Maschine (JVM) und die mitgeliefertenBibliotheken. Java als Programmiersprache sollte nicht mit der Java-Technologie gleichgesetzt werden; Java-Laufzeitumgebungen führenBytecode aus, der sowohl aus der Programmiersprache Java als auch aus anderen Programmiersprachen wieGroovy,Kotlin undScala kompiliert werden kann. Im Prinzip könnte jede Programmiersprache als Grundlage für Java-Bytecode genutzt werden, für die meisten existieren aber keine passenden Bytecode-Compiler.
Die ProgrammierspracheJava dient innerhalb der Java-Technologie vor allem zum Formulieren von Programmen. Diese liegen zunächst als reiner, menschenverständlicherText vor, dem sogenanntenQuellcode. Dieser Quellcode ist nicht direkt ausführbar; erst der Java-Compiler, der Teil des Entwicklungswerkzeugs ist, übersetzt ihn in den maschinenverständlichen Java-Bytecode. Die Maschine, die diesen Bytecode ausführt, ist jedoch typischerweise virtuell – das heißt, der Code wird meist nicht direkt durchHardware, wie z. B. einenMikroprozessor, ausgeführt, sondern durch entsprechendeSoftware auf der Zielplattform.
Zweck dieser Virtualisierung istPlattformunabhängigkeit: Das Programm soll ohne weitere Änderung auf jeder Rechnerarchitektur laufen können, sofern dort eine passende Laufzeitumgebunginstalliert ist. Oracle selbst bietet Laufzeitumgebungen für die BetriebssystemeLinux,macOS undWindows an. Andere Hersteller lassen eigene Java-Laufzeitumgebungen für ihre Plattformzertifizieren. Auch in Autos, HiFi-Anlagen und anderen elektronischen Geräten wird Java verwendet.
Java ist eine der populärsten Programmiersprachen. In dem seit 2001 veröffentlichtenTIOBE-Index lag Java bis 2020, konkurrierend mitC, stets auf den ersten beiden Plätzen. Seit 2021 belegt jedochPython den ersten Platz dieses Rankings – gefolgt von C, C++ und Java. Der Anteil von Java sank von ca. 25 % im Jahr 2001 auf etwa 10 % (2021–2025).[4] Nach dem RedMonk-Programmiersprachenindex liegt Java seit 2020 bzw. 2021 hinterJavaScript undPython.[5][6]
Java ist im Vergleich zu anderen objektorientierten Programmiersprachen wieC++ oderC# einfach, da es einen reduzierten Sprachumfang besitzt und beispielsweiseOperatorüberladung undMehrfachvererbung nicht unterstützt.
Eine Reihe einfacher Möglichkeiten für Netzwerkkommunikation, vonTCP/IP-Protokollen überRemote Method Invocation bis zuWebservices werden vor allem über JavasKlassenbibliothek angeboten; die Sprache Java selbst beinhaltet keine direkte Unterstützung für verteilte Ausführung.
Vertrautheit
Wegen der syntaktischen Nähe zu C++, der ursprünglichen Ähnlichkeit der Klassenbibliothek zuSmalltalk-Klassenbibliotheken und der Verwendung vonEntwurfsmustern in der Klassenbibliothek ist der Umstieg auf Java für erfahrene Programmierer vergleichsweise einfach.
Robustheit
Viele der Designentscheidungen bei der Definition von Java reduzieren die Wahrscheinlichkeit ungewollter Systemfehler; Beispiele dafür sind die starke Typisierung,Garbage Collection, Ausnahmebehandlung sowie Verzicht auf Zeigerarithmetik.
Sicherheit
Zur Verbesserung der Sicherheit stehen Konzepte wie der Class-Loader, der die sichere Zuführung von Klasseninformationen zur JavaVirtual Machine steuert, und Security-Manager, die sicherstellen, dass nur Zugriff auf Programmobjekte erlaubt wird, für die entsprechende Rechte vorhanden sind.
Architekturneutralität
Java wurde so entwickelt, dass dieselbe Version eines Programms prinzipiell auf einer beliebigen Computerhardware läuft, unabhängig von ihrem Prozessor oder anderenHardwarebestandteilen.
Portabilität
Zusätzlich zur Architekturneutralität ist Java portabel. Das heißt, dass elementare Datentypen sowohl in ihrer Größe und internen Darstellung als auch in ihrem arithmetischen Verhalten standardisiert sind. Beispielsweise ist einfloat immer einIEEE 754 Float von 32 Bit Länge. Dasselbe gilt beispielsweise auch für die Klassenbibliothek, mit deren Hilfe man eine vom Betriebssystem unabhängigeGUI erzeugen kann.
Leistungsfähigkeit
Java hat aufgrund derOptimierungsmöglichkeit zurLaufzeit das Potenzial, eine besserePerformance als aufCompilezeit-Optimierungen begrenzte Sprachen (C++ etc.) zu erreichen. Dem entgegen steht derOverhead durch die Java-Laufzeitumgebung, sodass die Leistungsfähigkeit von beispielsweise C++-Programmen in einigen Kontexten übertroffen,[8][9] in anderen aber nicht erreicht wird.[10] Um Leistungsfähigkeit zu gewährleisten, kann in der Java Virtual Machine (JVM) die Performance gemessen werden.[11]
Interpretierbarkeit
Java wird in maschinenunabhängigenBytecode kompiliert, dieser wiederum kann auf der Zielplattform interpretiert werden. DieJava Virtual Machine interpretiert Java-Bytecode, bevor sie ihn aus Performancegründen kompiliert und optimiert.
Parallelisierbarkeit
Java unterstütztMultithreading, also den parallelen Ablauf von eigenständigen Programmabschnitten. Dazu bietet die Sprache selbst die Schlüsselwörtersynchronized undvolatile – Konstrukte, die das „Monitor & Condition Variable Paradigma“ vonC. A. R. Hoare[12] unterstützen. Die Klassenbibliothek enthält weitere Unterstützungen für parallele Programmierung mit Threads. Moderne JVMs bilden einen Java-Thread aufBetriebssystem-Threads ab und profitieren somit vonProzessoren mit mehrerenRechenkernen.
Dynamisch
Java ist so aufgebaut, dass es sich an dynamisch ändernde Rahmenbedingungen anpassen lässt. Da die Module erst zur Laufzeit gelinkt werden, können beispielsweise Teile der Software (etwa Bibliotheken) neu ausgeliefert werden, ohne die restlichen Programmteile anpassen zu müssen. Interfaces können als Basis für die Kommunikation zwischen zwei Modulen eingesetzt werden; die eigentliche Implementierung kann aber dynamisch und beispielsweise auch während der Laufzeit geändert werden.
Abhängigkeitsgraph der Java-Core-Klassen (erstellt mit jdeps undGephi). In der Mitte des Diagramms sind die am häufigsten verwendeten Klassen Object und String zu sehen.
Die Grundidee derobjektorientierten Programmierung ist, Daten und zugehörige Funktionen möglichst eng in einem sogenannten Objekt zusammenzufassen und nach außen hin zu kapseln (Abstraktion). Die Absicht dahinter ist, große Softwareprojekte einfacher zuverwalten und die Qualität der Software zu erhöhen. Ein weiteres Ziel der Objektorientierung ist ein hoher Grad derWiederverwendbarkeit von Softwaremodulen.
Ein neuer Aspekt von Java gegenüber den objektorientierten Programmiersprachen C++ undSmalltalk ist die explizite Unterscheidung zwischenSchnittstellen undKlassen, die durch entsprechende Schlüsselwörterinterface undclass ausgedrückt wird. Java unterstützt kein Erben von mehreren unabhängigenBasisklassen (sogenannte „Mehrfachvererbung“ wie in C++ oderEiffel), wohl aber das Implementieren einer beliebigen Zahl von Schnittstellen, womit sich viele der entsprechenden Probleme ebenfalls lösen lassen. Dabei werdenMethodensignaturen und Standardimplementierungen vonMethoden an die abgeleiteten Klassen weitergegeben, jedoch keineAttribute.
Java ist nicht vollständig objektorientiert, da dieGrunddatentypen (int,boolean usw.) keine Objekte sind (siehe auch unterJava-Syntax). Sie werden allerdings ab Java 5 bei Bedarf automatisch und für den Programmierer transparent mittelsAutoboxing in die entsprechenden Objekttypen und umgekehrt umgewandelt.[13]
/** * Diese Klasse ist eine allgemeine Klasse für jedes beliebige Tier und bietet * Methoden an, die alle Tiere gemeinsam haben. */publicclassTier{/** * Diese Methode lässt das Tier kommunizieren. Die Unterklassen dieser * Klasse können diese Methode überschreiben und eine passende * Implementierung für das jeweilige Tier anbieten. */publicvoidkommuniziere(){// Wird von allen Unterklassen verwendet, die diese Methode nicht überschreiben.System.out.println("Tier sagt nichts.");}}/** * Deklariert die Klasse "Hund" als Unterklasse der Klasse "Tier". * Die Klasse "Hund" erbt damit die Felder und Methoden der Klasse "Tier". */classHundextendsTier{/** * Diese Methode ist in der Oberklasse "Tier" implementiert. Sie wird * in dieser Klasse überschrieben und für die Tierart "Hund" angepasst. */@Overridepublicvoidkommuniziere(){// Ruft die Implementierung dieser Methode in der Oberklasse "Tier" auf.super.kommuniziere();// Gibt einen Text in der Konsole aus.System.out.println("Hund sagt: 'Wuff Wuff'");}}/** * Deklariert die Klasse "Katze" als Unterklasse der Klasse "Tier". * Die Klasse "Katze" erbt damit die Felder und Methoden der Klasse "Tier". */classKatzeextendsTier{/** * Diese Methode ist in der Oberklasse "Tier" implementiert. Sie wird * in dieser Klasse überschrieben und für die Tierart "Katze" angepasst. */@Overridepublicvoidkommuniziere(){// Ruft die Implementierung dieser Methode in der Oberklasse "Tier" auf.super.kommuniziere();// Gibt einen Text auf der Konsole aus.System.out.println("Katze sagt: 'Miau'");}}classMain{/** * Methode, die beim Programmstart aufgerufen wird. */publicstaticvoidmain(String[]args){// Deklariert eine Variable für Instanzen der Klassen "Hund" und "Katze"Tiertier;// Erstellt eine Instanz der Klasse "Hund" und speichert die Instanz in// der Variable "tier"tier=newHund();// Ruft die Methode Hund.kommuniziere() auftier.kommuniziere();// Erstellt eine Instanz der Klasse "Katze" und speichert die Instanz in// der Variable "tier"tier=newKatze();// Ruft die Methode Katze.kommuniziere() auftier.kommuniziere();}}
Java bietet eineReflexion-API als Bestandteil derLaufzeitumgebung. Damit ist es möglich, zur Laufzeit auf Klassen und Methoden zuzugreifen, deren Existenz oder genaue Ausprägung zur Zeit der Programmerstellung nicht bekannt war. Häufig wird diese Technik im Zusammenhang mit dem EntwurfsmusterFabrikmethode (Factory Method) angewandt.
Mit Java 5 hat Sun die Programmiersprache umAnnotationen erweitert. Annotationen erlauben die Notation vonMetadaten und ermöglichen bis zu einem gewissen Grad benutzerdefinierte Spracherweiterungen. Sinn der Annotationen ist unter anderem die automatische Erzeugung von Code und anderen in der Software-Entwicklung wichtigen Dokumenten für wiederkehrende Muster anhand möglichst kurzer Hinweise im Quelltext. Bislang wurden in Java dafür ausschließlichJavadoc-Kommentare mit speziellen JavaDoc-Tags verwendet, die vonDoclets wie zum Beispiel demXDoclet ausgewertet wurden.
Annotationen können auch in den kompilierten Class-Dateien enthalten sein. Der Quelltext wird also für ihre Verwendung nicht benötigt. Insbesondere sind die Annotationen auch über die Reflection-API zugänglich. So können sie zum Beispiel zur Erweiterung desBean-Konzeptes verwendet werden.
Java bietet die Möglichkeit, Klassen zu schreiben, die in unterschiedlichen Ausführungsumgebungen ablaufen. Beispielsweise lassen sichApplets in Webbrowsern, die Java unterstützen, ausführen. Das Sicherheitskonzept von Java kann dazu eingesetzt werden, dass unbekannte Klassen dabei keinen Schaden anrichten können, was vor allem beiApplets wichtig ist (siehe auchSandbox). Beispiele für in entsprechenden Ausführungsumgebungen ausführbare Java-Module sindApplets,Servlets,Portlets,MIDlets,Xlets,Translets, undEnterprise JavaBeans.
Der Objektzugriff in Java istVM-intern überReferenzen implementiert, die den aus C oder C++ bekanntenZeigern ähneln.[14] Die Sprachdefinition (Java Language Specification) bezeichnet sie als „Reference Values“ um deutlich zu machen, dass sie imQuelltext des jeweiligen Programms alsCall by value übergeben werden.[15] Aus Sicherheitsgründen erlauben diese nicht, die tatsächliche Speicheradresse zu erkennen oder zu modifizieren. SogenannteZeigerarithmetik ist in Java somit ausgeschlossen. Per Design kann so ein häufiger Typ von Fehlern, die in anderen Programmiersprachen auftreten, von vornherein ausgeschlossen werden.
Zusammengehörige Klassen werden in Paketen (englischpackages) zusammengefasst. Diese Pakete ermöglichen die Einschränkung der Sichtbarkeit von Klassen, eine Strukturierung von größeren Projekten sowie eine Trennung des Namensraums für verschiedene Entwickler. Die Paketnamen sind hierarchisch aufgebaut und beginnen meist mit dem (umgekehrten) Internet-Domainnamen des Entwicklers, also beispielsweisecom.google bei Klassenbibliotheken, dieGoogle zur Verfügung stellt. Klassennamen müssen nur innerhalb eines Paketes eindeutig sein. Hierdurch ist es möglich, Klassen von verschiedenen Entwicklern zu kombinieren, ohne dass es zu Namenskonflikten kommt. Die Hierarchie der Paketnamen hat allerdings keinesemantische Bedeutung. Bei der Sichtbarkeit zwischen den Klassen zweier Pakete spielt es keine Rolle, wo sich die Pakete in der Namenshierarchie befinden. Klassen sind entweder nur für Klassen des eigenen Paketes sichtbar oder für alle Pakete.
Weiter unterstützt die SpracheThreads (nebenläufig ablaufende Programmteile) undAusnahmen (englischexception). Java beinhaltet auch eineautomatische Speicherbereinigung (englischgarbage collector), die nicht (mehr) referenzierte Objekte aus dem Speicher entfernt.
Java unterscheidet explizit zwischenSchnittstellen undKlassen. Eine Klasse kann beliebig viele Schnittstellen implementieren, hat aber stets genau eineBasisklasse. Java unterstützt kein direktes Erben von mehreren Klassen („Mehrfachvererbung“), jedoch die Vererbung über mehrere Hierarchie-Ebenen (KlasseKind erbt von KlasseVater, die ihrerseits von KlasseGroßvater erbt usw.). Je nachSichtbarkeit (public,protected,default/package-private,private) erbt die KlasseMethoden und Attribute (auch Felder genannt) von ihren Klassenvorfahren. Alle Klassen sind – direkt oder indirekt – von der WurzelklasseObject abgeleitet.
Zu Java gehört eine umfangreiche Klassenbibliothek. Dem Programmierer wird damit eine einheitliche, vom zugrundeliegenden Betriebssystem unabhängigeSchnittstelle (Application programming interface, API) angeboten.
Syntax/Grammatik undSemantik von Java sind in derJava Language Specification (Java-Sprachspezifikation) vonSun Microsystems dokumentiert. Das folgende Beispielprogramm gibt die unter Programmierern klassische Meldung „Hallo Welt!“, gefolgt von einem Zeilenumbruch, auf dem Ausgabemedium aus.
Herkunft und Entwicklung der Programmiersprache Java sowie mit ihr verwandter Technik sind im ArtikelJava-Technologie beschrieben sowie wann welche Version veröffentlicht wurde.
Neben Oracle kümmert sich eine Vielzahl von Einzelpersonen, kleiner und großer Unternehmen, wieApple,IBM,Hewlett-Packard undSiemens beimJava Community Process (JCP) unter anderem um die Weiterentwicklung der Java-Sprachspezifikation. Der JCP wurde 1998 von Sun Microsystems ins Leben gerufen.
Sun hatte zugesichert, seinJDK unter derGNU General Public License zu veröffentlichen; mit der Übernahme durch Oracle wurde auch die offene Lizenzierung übernommen. Am 13. November 2006 wurden bereits mit dem Compiler javac und derHotspot Virtual Machine erste Teile alsOpen Source veröffentlicht. Zudem wurde mitOpenJDK eine Community-Seite eröffnet, mit deren Hilfe die Entwicklung koordiniert werden soll.[16] Am 8. Mai 2007 folgten dann große Teile des „Java-SE“-Quellcodes zum Erstellen eines JDK. Eine Ausnahme stellte solcher Code dar, für den Sun nicht die nötigen Rechte besaß, um ihn freizugeben. Dieser liegt somit nur in kompilierter Form vor.[17] Ebenfalls kündigte Sun an, dass Entwicklungen auf Grundlage des OpenJDK das „Java Compatible“-Logo führen dürfen, wenn sie nach dem „Java Compatibility Kit“ (JCK) zertifiziert sind.
Zuvor wurde der Quelltext von Java unter anderem bei jedem JDK mitgeliefert und ermöglichte so zwar Einsicht, er durfte aber nicht beliebig modifiziert werden. Deswegen gibt es neben den offiziellen JCP auch diverse unabhängige Vereinigungen, die es sich zum Ziel gesetzt haben, ein unter eine freie Open-Source-Lizenz gestelltes Java bereitzustellen. Die bekanntesten dieser Projekte warenApache Harmony,Kaffe und dasGNU-Classpath-Projekt. Gegenwärtig gibt es neben OpenJDK noch eine weitere große Implementierung, die aktuelle Java Releases veröffentlicht,Eclipse OpenJ9. Diese JVM-Implementierung wurde von IBM an dieEclipse Foundation übergeben.[18] OpenJ9 steht mehrfachlizenziert unterEPL 2.0,Apache 2.0 undGNU 2.0with Classpath Exception.[19]
Darüber hinaus bietet Java die Möglichkeit, aus Java-Code heraus verschiedene Skriptsprachen auszuführen. Ebenfalls gibt es eine Reihe an Programmiersprachen, die nach Java-Bytecode kompiliert werden. Damit lassen sich Programmteile auch in anderen Programmiersprachen umsetzen.Mit JDK Version 7, das am 28. Juli 2011 erschienen ist,[20] wurde auch die Unterstützung für dynamische „Fremdsprachen“ durch die Virtual Machine verbessert.[21]
Java darf nicht mit derSkriptspracheJavaScript verwechselt werden. JavaScript wurde vonNetscape Communications entwickelt, hieß früher LiveScript und wurde im Zuge einer Kooperation zwischen Netscape und Sun Microsystems in JavaScript umbenannt.[22]
JavaScript ist einedynamisch typisierte, objektbasierte, aber, bisECMAScript 2015, klassenlose Skriptsprache mit einer ähnlichenSyntax wie C,Perl oder Java, unterscheidet sich jedoch in vielerlei Hinsicht von Java. Trotz der Ähnlichkeit der Namen der beiden Programmiersprachen unterscheidet sich Java stärker von JavaScript als zum Beispiel von C++ oder C#. JavaScript wurde ursprünglich vornehmlich inHTML-Seiten zur eingebetteten Programmierung verwendet, um interaktive Webapplikationen zu ermöglichen. Mittlerweile wird JavaScript auf der LaufzeitumgebungNode.js zunehmend auch für Server-Applikationen genutzt.
Smalltalk ist eine der ältesten objektorientierten Programmiersprachen überhaupt. Java erbt von Smalltalk die grundsätzliche Konzeption eines Klassenbaumes, in den alle Klassen eingehängt werden. Dabei stammen alle Klassen entweder direkt oder indirekt von der Klassejava.lang.Object ab. Außerdem wurden die Konzepte derautomatischen Speicherbereinigung(garbage collector) und dervirtuellen Maschine übernommen sowie eine Vielzahl weiterer Merkmale der Sprache Smalltalk.
Smalltalk kennt jedoch keine primitiven Datentypen wie zum Beispielint – selbst eine einfache Zahl ist ein Objekt. Dieses Konzept wurde nicht nach Java übernommen, primitive Datentypen werden aber ab Java 5 mittelsAutoboxing bei Bedarf in die entsprechenden Objekttypen und umgekehrt umgewandelt.[13]
Java lehnt seine Syntax an die der ProgrammierspracheC++ an. Im Gegensatz zu C++ fanden jedoch Mehrfachvererbung oderZeigerarithmetik keinen Einzug. Klassen können nur eine Superklasse haben (Einfachvererbung), aber eine beliebige Anzahl von Interfaces implementieren. Interfaces entsprechen abstrakten Klassen in C++, die keine Attribute oder konkrete Methoden besitzen, werden allerdings konzeptionell anders als die auch in Java möglichen abstrakten Klassen verwendet. Die interne Speicherverwaltung wird dem Java-Entwickler weitgehend abgenommen; dies erledigt dieautomatische Speicherbereinigung. Allerdings garantiert auch dieser Mechanismus nicht den vollständigen Ausschluss vonSpeicherlecks. Letztlich muss der Programmierer dafür sorgen, dass nicht mehr verwendete Objekte von keinem laufenden Thread mehr referenziert werden. Einander referenzierende Objekte, die von keinem Thread aus mehr über Referenzen erreichbar sind, werden ebenfalls freigegeben, wobei es demGarbage Collector (GC) obliegt, wann und ob überhaupt diese Objekte freigegeben werden. Jede Objektklasse besitzt zusätzlich eine Methode namensfinalize(), die vom Garbage Collector aufgerufen werden kann, um zusätzliche „Aufräumarbeiten“ durchzuführen. Es gibt jedoch keine Garantie, wann und ob dies geschieht. Sie ist daher nicht mit einem Destruktor aus C++ vergleichbar.
Neben Mehrfachvererbung und Speicherarithmetik wurden bei der Entwicklung von Java noch weitere Konstrukte der Sprache C++ bewusst weggelassen:
Im Gegensatz zu C++ ist es in Java nicht möglich, Operatoren (zum Beispiel arithmetische Operatoren wie+ und-, logische Operatoren wie&& und||, oder den Index-Operator[]) zuüberladen, das heißt in einem bestimmten Kontext mit neuer Bedeutung zu versehen. Dies sorgt einerseits für eine Vereinfachung der Sprache an sich und verhindert, dass Quellcodes mit Operatoren, die mit schwer nachvollziehbarer Semantik überladen werden, unleserlich gemacht werden. Andererseits würden benutzerdefinierte Typen mit überladenen Operatoren in C++ eher wie eingebaute Typen erscheinen können – vor allem numerischer Code wäre so mitunter einfacher nachzuvollziehen. Die Sprachdefinition von Java definiert jedoch typabhängiges Verhalten der Operatoren+ (Addition bei arithmetischen Operanden, andernfalls zur Verkettung von Zeichenketten „string concatenation“) sowie&,| und^ (logisch für boolean und bitweise für arithmetische Operanden). Das lässt diese Operatoren zumindest wie teilweise überladene Operatoren erscheinen.
Das C++-Konstrukt derTemplates, die es erlauben, Algorithmen oder sogar ganze Klassen unabhängig von den darin verwendeten Datentypen zu definieren, wurde in Java nicht übernommen. Ab Version 5 unterstützt Java aber sogenannteGenerics, die zwar keinerleiMetaprogrammierung erlauben, aber ähnlich wie C++-Templates typsichere Container und ähnliches ermöglichen.
In Java wurde das Schlüsselwortconst reserviert, hat aber keine Funktion. Die Alternative zuconst (und Präprozessor-Direktiven) istfinal. Im Gegensatz zuconst wird final in einer Methodensignatur nicht vererbt und hat somit nur im aktuellen Scope Gültigkeit. Denfinal-Modifikator kann eine Klasse (die dadurch nicht mehr abgeleitet werden kann), ein Attribut (dessen Wert so nur einmal gesetzt werden kann) oder eine Methode (die dadurch unüberschreibbar wird) besitzen.
Die.NET-Plattform vonMicrosoft kann als Konkurrenzprodukt zu Java gesehen werden. Mit der Spezifikation vonC# hat Microsoft im Rahmen seiner .NET-Strategie versucht, den Spagat zwischen der Schaffung einer neuen Sprache und der leichten Integration bestehender Komponenten zu schaffen.
Konzeptionelle Unterschiede zu Java bestehen insbesondere in der Umsetzung von Callback-Mechanismen. In .NET ist hierzu die Unterstützung vonDelegaten (englischdelegates) implementiert, einem Konzept, das mit Funktionszeigern vergleichbar ist. In Java kann dies über Methodenreferenzen oder Lambdaausdrücke erreicht werden.
Des Weiteren unterstützen .NET-Sprachen sogenannte Attribute (attributes), die es erlauben, die Funktionalität der Sprache über Metadaten im Code zu erweitern (eine ähnliche Funktionalität wurde in Form der oben beschriebenenAnnotations in Java 5.0 übernommen).C# enthält auch Bestandteile der SpracheVisual Basic, zum Beispiel Eigenschaften (properties), sowie Konzepte aus C++.
In .NET ist es ebenso wie in Java möglich, Ausnahmen (exceptions) zu einer Methode zu deklarieren. In Java können Ausnahmen so deklariert werden, dass sie auch verarbeitet werden müssen (Checked Exception).
Windows Systembefehle (Win-ABI-Aufrufe) können in .NET überplatform invoke oder mittels C++/CLI aufgerufen werden. Das ist in Java nicht möglich, es besteht mit demJava Native Interface aber die Möglichkeit, C- und C++-Code per DLL direkt zu referenzieren und außerhalb derJava Virtual Machine ausführen zu lassen.
Scala ist eine Programmiersprache, die objektorientierte und funktionale Paradigmen vereint und wie Java auf derJava Virtual Machine ausgeführt werden kann.
Im Gegensatz zu Java, und ähnlich wie C#, ist das Typsystem vereinheitlicht und umfasst Referenz- und Werttypen. Benutzer können weitere Typen definieren – in Java sind die verfügbaren Werttypen auf die fest vordefinierten primitiven Typen (int,long, …) beschränkt.
Scala verwendet statt Schnittstellen (interface) sogenannte Traits (traits), die wiederverwendbare Methodenimplementierungen enthalten können.Weitere Funktionalität, die nicht in Java enthalten ist, umfasst unter anderem Typen undFunktionen höherer Ordnung,Pattern Matching und frei wählbare Methoden- und Klassennamen.
Wie in C# gibt es keinechecked exceptions. Allerdings können Methoden mit einer@throws-Annotation versehen werden. Scala entfernt unter anderem das Konzept statischer Methoden und Klassen (ersetzt durchcompanion objects),Raw Types, die Notwendigkeit von Getter- und Settermethoden und die unsichere Varianz von Arrays.
Die Varianz generischer Typen muss nicht wie in Java bei der Nutzung erfolgen (use-site variance), sondern kann direkt bei der Deklaration angegeben werden (declaration-site variance).
Anders als in Java wird bei Kotlin derDatentyp einerVariable nicht vor dem Variablennamen, sondern danach, abgetrennt durch einen Doppelpunkt, notiert. Allerdings unterstützt Kotlin auchTypinferenz, sodass der Typ oft auch weggelassen werden kann, wenn er aus dem Zusammenhang klar ist. Als Anweisungsende genügt der Zeilenumbruch, optional kann jedoch auch ein Semikolon verwendet werden.[23] Zusätzlich zuKlassen undMethoden (in Kotlin:member functions) aus derobjektorientierten Programmierung unterstützt Kotlinprozedurale Programmierung unter Verwendung vonFunktionen sowie bestimmte Aspekte derfunktionalen Programmierung.[24] Als Einstiegspunkt dient wie beiC u. ä. einemain-Funktion.
Kotlin lässt sich außerdem zur Entwicklung vonAndroid-Apps verwenden und wird dafür seit 2017 offiziell vonGoogle unterstützt.[25] Seit Mai 2019 ist Kotlin die von Google bevorzugte Sprache für Android-Appentwicklung.[26]
Java-Webanwendungen sind Java-Programme, die auf einem Webserver geladen und gestartet werden und beim Benutzer in einem Webbrowser ablaufen bzw. dargestellt werden. Üblicherweise läuft ein Teil der Webanwendung auf dem Server (dieGeschäftslogik undPersistenz) und ein anderer Teil am Webbrowser (die Logik dergrafischen Benutzeroberfläche). Der Serverteil wird üblicherweise vollständig in Java geschrieben, der Browserteil üblicherweise in HTML und JavaScript. Es ist jedoch auch möglich, Java-Webanwendungen inklusive GUI-Logik vollständig in Java zu schreiben (siehe z. B.Google Web Toolkit oder dieRemote Application Platform). Bekannte Beispiele für Java-Webanwendungen sindTwitter,[27]Jira,Jenkins oderGmail (das nicht vollständig, aber zu großen Teilen in Java geschrieben ist).
Unter Desktop-Anwendungen oder Applikationen werden normale Desktop-Programme zusammengefasst. Sowohl Internet-Kommunikationsprogramme als auch Spiele oder Office-Anwendungen, die auf einem normalen PC laufen, werden so genannt. Bekannte Beispiele für Java-Desktop-Anwendungen sind dieintegrierte EntwicklungsumgebungEclipse, dasFilesharing-ProgrammVuze oder dasComputerspielMinecraft.
Java-Applets sind Java-Anwendungen, die normalerweise in einemWebbrowser ausgeführt werden. Sie sind üblicherweise auf einen durch ein speziellesHTML-Tag definierten Bereich einer Webseite beschränkt. Voraussetzung für die Ausführung von Java-Applets ist ein Java-fähiger Browser. Diese Anwendungsform wird seit Java 11 nicht mehr unterstützt, nachdem sie bereits in Java 9 als „veraltet“ gekennzeichnet wurde.[28][29][30][31]
Apps sind kleinere Applikationen für mobile Geräte wie Handys, Smartphones, PDAs oder Tablets. Sie laufen üblicherweise auf speziellen, für die Ausführung von Java-Anwendungen auf mobilen Geräten optimierten Java-Plattformen wieJava ME.
Es gibt eine große Vielfalt vonEntwicklungsumgebungen für Java, sowohl proprietäre als auch freie (Open Source). Die meisten Entwicklungsumgebungen für Java sind selbst ebenfalls in Java geschrieben.
Die bekanntesten Open-Source-Umgebungen sind das von der Eclipse Foundation bereitgestellteEclipse und das von Sun entwickelteNetBeans.
Apple liefert mitmacOS ab Version 10.3 die EntwicklungsumgebungXcode aus, die verschiedene Programmiersprachen unterstützt, allerdings einen Schwerpunkt auf C, C++, Objective-C und Swift setzt.[33][34]Für das Programmieren von Android-Apps mit Java empfiehlt sichAndroid Studio.
Für Einsteiger und Ausbildungszwecke konzipiert ist die IDEBlueJ, wo unter anderem die Beziehungen zwischen den verschiedenen Klassen grafisch in Form vonKlassendiagrammen dargestellt werden.
Ein Java-Compiler übersetzt Java-Quellcode (Dateiendung „.java“) in einen ausführbaren Code. Grundsätzlich unterscheidet man zwischen Bytecode- undNativecode-Compilern. EinigeJava-Laufzeitumgebungen verwenden einenJIT-Compiler, um zur Laufzeit den Bytecode häufig genutzter Programmteile in nativenMaschinencode zu übersetzen.
Im Normalfall übersetzt der Java-Compiler die Programme in einen nicht direkt ausführbarenBytecode (Dateiendung „.class“), den die Java Runtime Environment (JRE) später ausführt. Die aktuelleHotSpot-Technologie kompiliert den Bytecode zur Laufzeit in nativen Prozessorcode und optimiert diesen abhängig von der verwendeten Plattform. Diese Optimierung findet dabei nach und nach statt, sodass der Effekt auftritt, dass Programmteile nach mehrmaliger Abarbeitung schneller werden. Andererseits führt diese Technik, die ein Nachfolger der Just-in-time-Kompilierung ist, dazu, dass Java-Bytecode theoretisch genauso schnell wie native, kompilierte Programme ausgeführt werden könnte.
Die HotSpot-Technik ist seit der JRE Version 1.3 verfügbar und wurde seitdem stetig weiter verbessert.
Beispiele für Bytecode-Compiler sindjavac (Teil desJDK) und warJikes (eingestellt, Funktionsumfang bis Java SE 5) vonIBM.
Es existieren auch Compiler für Java, die Java-Quelltexte oder Java-Bytecode in „normalen“Maschinencode übersetzen können, sogenannteAhead-of-time-Compiler. Nativ kompilierte Programme haben den Vorteil, keineJavaVM mehr zu benötigen, aber auch den Nachteil, nicht mehr plattformunabhängig zu sein.
Beispiele für native Java-Compiler warenExcelsior JET (eingestellt, bis Java SE 7), sowieGNU Compiler for Java (GCJ, eingestellt, bis J2SE 5.0) wieMinGW,Cygwin oder JavaNativeCompiler (JNC).
Als weitere Möglichkeit kann das Java-Programm in ein anderes Programm „eingepackt“ (englischto wrap) werden; diese äußere Hülle dient dann als Ersatz für einJava-Archiv. Sie sucht selbständig nach einer installiertenJava-Laufzeitumgebung, um das eigentliche Programm zu starten, und informiert den Benutzer darüber, wo er eineLaufzeitumgebung herunterladen kann, sofern noch keine installiert ist. Es ist also immer noch eine Laufzeitumgebung nötig, um das Programm starten zu können, aber der Anwender erhält eine verständliche Fehlermeldung, die ihm weiterhilft.
Java Web Start ist ein etwas eleganterer und standardisierter Ansatz für diese Lösung – er ermöglicht die einfache Aktivierung von Anwendungen mit einem einzigen Mausklick und garantiert, dass immer die neueste Version der Anwendung ausgeführt wird. Dadurch werden komplizierte Installations- oder Aktualisierungsprozeduren automatisiert.
Beispiele für Java-Wrapper sindJSmooth oder Launch4J.JBuilder vonBorland undNSIS sind ebenfalls in der Lage, einen Wrapper für Windows zu erstellen.
Sowohl international als auch in Deutschland gibt es Java User Groups (JUG). Der Zweck dieser Vereinigungen an Java-Anwendern ist freier Informationsaustausch.
↑Hajo Schulz:Daniel Düsentrieb, C#, Java, C++ und Delphi im Effizienztest. Teil 1. In:c’t.Nr.19. Heise Zeitschriften Verlag, Hannover 2003,S.204–207 (heise.de [abgerufen am 21. Oktober 2010]). Hajo Schulz:Daniel Düsentrieb, C#, Java, C++ und Delphi im Effizienztest. Teil 2. In:c’t.Nr.21. Heise Zeitschriften Verlag, Hannover 2003,S.222–227 (heise.de [abgerufen am 21. Oktober 2010]).
↑J.P.Lewis, Ulrich Neumann: Java pulling ahead? Performance of Java versus C++. Computer Graphics and Immersive Technology Lab, University of Southern California, Januar 2003, abgerufen am 21. Oktober 2010 (englisch): „This article surveys a number of benchmarks and finds that Java performance on numerical code is comparable to that of C++, with hints that Java’s relative performance is continuing to improve.“
↑Robert Hundt:Loop Recognition in C++/Java/Go/Scala. Hrsg.: Scala Days 2011. Stanford CA 27. April 2011 (englisch,scala-lang.org [PDF;318kB; abgerufen am 17. November 2012]):We find that in regards to performance, C++ wins out by a large margin. […] The Java version was probably the simplest to implement, but the hardest to analyze for performance. Specifically the effects around garbage collection were complicated and very hard to tune
↑David Georg Reichelt: Java pulling ahead? JVM Performance-Regressionen frühzeitig erkennen und vermeiden. Informatik Aktuell, Alkmene Verlag, 4. Februar 2022, abgerufen am 6. Februar 2022: „Im JVM-Umfeld ist vor allem JMH zur Definition von Benchmarks verbreitet. Die regelmäßige Ausführung von JMH-Benchmarks wird aus Ressourcengründen aber nur selten durchgeführt. Statt immer alle Regressions-Benchmarks oder -Tests auszuführen, ist es viel schneller, nur diejenigen auszuführen, bei denen eine Regression möglich ist. Daher ermöglicht das Jenkins-Plugin Peass-CI die Automatisierung der Regressions-Testselektion für JMH, so dass in der aktuellen Version nur noch für diese Version relevante Workloads getestet werden.“
↑Scott Stanchfield: Java is Pass-by-Value, Dammit! JavaDude.com, archiviert vom Original (nicht mehr online verfügbar) am 15. Mai 2008; abgerufen am 5. November 2010 (englisch).