Java ist eine objektorientierte Programmiersprache und als solche ein eingetragenes Warenzeichen der Firma Sun Microsystems. Sie ist eine Komponente der Java-Technologie.
Java-Programme werden in einer speziellen Umgebung, der Java-Laufzeitumgebung oder Java-Plattform ausgeführt, deren wichtigster Bestandteil die Java Virtual Machine ist. Dazu werden Java-Programme in Bytecode übersetzt, der von der virtuellen Maschine ausgeführt wird.
Java-Programme laufen in aller Regel ohne weitere Anpassungen auf verschiedenen Computern und Betriebssystemen. Sun bietet neben dem eigenen UNIX-Derivat Solaris auch Java-VMs für Linux und Windows an. Andere Hersteller lassen ihre Java-VM für ihre Plattform zertifizieren, zum Beispiel die Firma Apple für Mac OS X.
Von Portierung spricht man bei Java in der Regel, wenn Quelltext oder Bytecode auf den Stand einer anderen Java-Version angepasst werden soll. Meistens sind Java-Programme deshalb nur für bestimmte Java-Versionen getestet oder zertifiziert.
Ein neuer Aspekt von Java gegenüber den zuvor verbreitetsten objektorientierten Programmiersprachen C++ und Smalltalk ist die explizite Unterscheidung zwischen Schnittstellen und Klassen, die auch durch entsprechende Schlüsselwörter interface und class zur Geltung kommt.
Java ist nicht vollständig objektorientiert: Die Grunddatentypen (int, boolean usw.) und Literale sind keine Objekte (siehe auch unter Java-Syntax). Ferner unterstützt Java keine direkte Mehrfachvererbung (wie z. B. Eiffel) wobei diese doch über Schnittstellen simuliert werden kann.
Annotations 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 des Bean-Konzeptes verwendet werden.
Der Bytecode funktioniert also als Zwischencode, zwischen Programmiersprache und Maschinensprache. So ist das Javaprogramm nicht an eine bestimmte Maschine gebunden. Das Java Runtime Environment existiert für weit verbreitete Betriebssysteme wie Microsoft Windows, Linux, Solaris, Mac OS X, AIX und viele andere. Daneben gibt es eine JRE nicht nur für Server- und Desktop-Betriebssysteme, sondern auch für viele eingebettete Systeme wie Mobiltelefone, PDAs, sowie Smartcards und andere technische Plattformen, wie Auto und TV. Die Plattformunabhängigkeit endet jedoch für solche Systeme, für die keine Java Virtual Machine existiert, zumeist ältere oder sehr exotische Systeme.
Es gibt aber auch Compiler, die Java direkt in Maschinencode übersetzen (Siehe Java: Native Compiler).
Wer von „Plattformunabhängigkeit“ und „Java“ spricht, muss zwischen der Java-VM selbst und den Programmen, die in Java geschrieben sind, unterscheiden. Die Java-VM, die die eigentliche Plattformunabhängigkeit ermöglicht, ist selbst plattformabhängig, da sie auf ein bestimmtes Betriebssystem und eine Rechnerarchitektur angepasst ist. Zum Beispiel ist Suns Java-VM für Windows in C++ geschrieben und durch C++ kompiliert. Andere Komponenten des JDKs wie zum Beispiel der Java-Compiler, sind in purem Java geschrieben und damit wieder plattformunabhängig, das heißt, der Bytecode des Compilers ist auf unterschiedlichen Plattformen identisch. Das Gleiche gilt für den Bytecode von Programmen, die in Java geschrieben und durch einen Java-Compiler kompiliert wurden.
Zusammengehörige Klassen werden in Paketen (englisch packages) 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 im Allgemeinen mit dem (umgekehrten) Internet-Domainnamen des Entwicklers. (Pakete, die von Sun erstellt werden, beginnen z. B. mit „com.sun.“) 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 keine semantische 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 Sprache Threads (nebenläufig ablaufende Programmteile) und Ausnahmen (englisch exception) und Java beinhaltet auch eine automatische Speicherbereinigung (englisch garbage collector), die nicht (mehr) referenzierte Objekte aus dem Speicher entfernt.
Bemerkenswert ist auch die explizite Unterscheidung von Schnittstellen und Klassen. Eine Klasse kann beliebig viele Schnittstellen implementieren, hat aber stets genau eine Basisklasse. Java unterstützt keine Mehrfachvererbung, da lediglich Schnittstellen, jedoch keine Klassen „mehrfach“ vererbt werden können. Funktionen (in der Java-Welt „Methoden“) werden nur von der Basisklasse übernommen.
Alle Klassen sind – direkt oder indirekt – von der Wurzelklasse Object abgeleitet.
Zu Java gehört eine umfangreiche Klassenbibliothek. Dem Programmierer wird damit eine einheitliche, vom zugrunde liegenden Betriebssystem unabhängige Schnittstelle (Application programming interface, API) angeboten.
Mit Java 1.2 wurden die Java Foundation Classes (JFC) eingeführt, die unter anderem Swing bereitstellen, das zur Erzeugung plattformunabhängiger grafischer Benutzerschnittstellen (GUI) dient und auf AWT basiert.
public class HelloWorld { public static void main(String* args) { System.out.println("Hallo Welt!"); } }
Die Grammatik von Java ist in der Java Language Specification (Java-Sprachspezifikation) von Sun Microsystems dokumentiert.
Herkunft und Entwicklung der Programmiersprache Java sowie mit ihr verwandter Technik sind im Artikel Java (Technologie) beschrieben.
Neben Sun kümmert sich eine Vielzahl von Einzelpersonen, kleiner und großer Unternehmen, wie Apple, IBM, Hewlett-Packard und Siemens beim JCP (Java Community Process) unter anderem um die Weiterentwicklung der Java-Sprachspezifikation. Der JCP wurde 1998 von Sun Microsystems ins Leben gerufen.
Obwohl der Sourcecode von Java unter anderem bei jedem JDK mitgeliefert wird und so zwar Einsicht genommen werden kann, darf er nicht beliebig modifiziert werden. Deswegen gibt es neben den offiziellen JCP auch eine Menge unabhängiger Vereinigungen, die es sich zum Ziel gesetzt haben, ein unter eine freie Open-Source-Lizenz gestelltes Java bereitzustellen. Die meisten dieser Entwicklungen basieren auf dem so genannten GNU Classpath-Projekt der Free Software Foundation.
Java erbte von Smalltalk die grundsätzliche Konzeption eines Objektbaumes, in den alle Objekte eingehängt werden und von einem einzigen Mutterobjekt abstammen (java.lang.Object). Des Weiteren wurde das Konzept der automatischen Speicherbereinigung (garbage collector) und der virtuellen Maschine übernommen sowie eine Vielzahl weiterer Merkmale der Sprache Smalltalk.
Smalltalk kennt jedoch keine primitiven Datentypen wie zum Beispiel int – selbst eine einfache Zahl ist ein Objekt. Dies wurde in Java geändert.
Klassisch für Smalltalk-Systeme ist der Object-Browser, der in modernen integrierten Entwicklungsumgebungen, wie zum Beispiel Eclipse auch für Java existiert.
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, unlesbar gemacht werden. Andererseits können benutzerdefinierte Typen mit überladenen Operatoren in C++ eher wie eingebaute Typen erscheinen und vor allem numerischer Code ist mitunter einfacher nachzuvollziehen. Die Sprachdefinition von Java definiert jedoch typabhängiges Verhalten der Operatoren + (Addition bei arithmetischen Operanden, andernfalls zur String-Konkatenation) 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 der „Templates“, die es erlauben, Algorithmen oder sogar ganze Klassen unabhängig von den darin verwendeten Datentypen zu definieren, wurde in Java nicht übernommen. Seit Version 1.5 unterstützt Java aber so genannte „Generics“, die zwar keinerlei Metaprogrammierung erlauben, aber ähnlich wie C++-Templates typsichere Container und ähnliches ermöglichen.
Die Syntax von C# entspricht in großen Teilen der Syntax von Java, konzeptionelle Unterschiede bestehen insbesondere in der Unterstützung von Delegaten (engl. delegates), einem Konzept, das mit Funktionszeigern vergleichbar ist. Hierbei kommt ein Beobachter-Entwurfsmuster zum Einsatz – Objekte können sich für Ereignisse registrieren bzw. diese delegieren. C# kennt ebenso wie Java eine Unterscheidung zwischen Werttypen (engl. value types; zum Beispiel int, struct) und Referenztypen (engl. reference types, zum Beispiel class), allerdings sind auch die elementaren Datentypen objektbasiert. Des Weiteren unterstützt C# so genannte Attribute (attributes), die es erlauben, die Funktionalität der Sprache über Metadaten im Code zu erweitern (eine ähnliche Funktionalität gibt es seit Java 5.0). C# enthält auch Bestandteile der Sprachen VisualBasic, zum Beispiel Eigenschaften („properties“) sowie C++. In C# hingegen ist es nicht notwendig und möglich, Ausnahmen (exceptions) zu einer Methode zu deklarieren. In Java müssen einmal deklarierte Ausnahmen auch verarbeitet werden.
Um auch systemnahe Programmierung zu ermöglichen, besteht in .NET die Möglichkeit, über platform invoke Systembefehle und unmanaged code aufzurufen, ähnlich Javas JNI.
Performancekritische Programmteile können in C# in so genanntem unsicheren unsafe code geschrieben werden, was ähnlich zu inline-assembler in C-Programmen zu sehen ist. Java kennt hierfür keine Entsprechung.
Bislang gibt es Microsofts .NET-Implementierung nur für Microsoft-eigene Betriebssysteme (ab Windows NT 4 SP 6) – abgesehen von einer Referenz-Implementierung für das FreeBSD-Betriebssystem, die aber unter der so genannten Shared-Source-Lizenz (Quellcode-Modifikationen dürfen nicht weitergegeben werden) veröffentlicht wurde, weswegen das Mono-Projekt und DotGNU eigene Implementierungen vorantreiben. Dabei werden auch weitere Betriebssysteme unterstützt.
Die bekanntesten Open-Source-Umgebungen sind Eclipse und NetBeans.
Unter den kommerziellen Entwicklungsumgebungen sind das auf Netbeans basierende Sun ONE Studio von Sun, IntelliJ IDEA von JetBrains, JBuilder von Borland sowie JCreator am verbreitetsten. Außerdem gibt es noch eine, um einige hundert Plugins erweiterte Version von Eclipse, die von IBM unter dem Namen WebSphere Studio Application Developer („WSAD“) vertrieben wurde und seit Version 6.0 Rational Application Developer („RAD“) heißt.
Apple liefert mit Mac OS X ab Version 10.3 die Entwicklungsumgebung Xcode aus, die verschiedene Programmiersprachen unterstützt und einen Schwerpunkt auf Java setzt. Xcode ist nach Registrierung für jedermann kostenlos erhältlich.
Wer lieber einen Texteditor verwendet, findet in Emacs zusammen mit der JDEE (Java Development Environment for Emacs) ein mächtiges Werkzeug. Für andere Editoren wie Vim, Jed oder Textpad gibt es ebenfalls entsprechende Modi.
Die HotSpot-Technologie ist seit der JRE Version 1.3.0 verfügbar und wurde seitdem immer weiter verbessert.
Java Web Start ist ein etwas eleganterer Ansatz für diese Problematik – er ermöglicht die einfache Aktivierung von Anwendungen mit einem einzigen Mausklick und garantiert, dass Sie immer die neueste Version der Anwendung ausführen. Dadurch werden komplizierte Installations- oder Aktualisierungsprozeduren vermieden.
Wikipedia-Artikel zur geschichtlichen Entwicklung von Java:
Programmiersprache | Programmiersprache Java
جافا | Java | Llenguatge Java | Java | Java (programmeringssprog) | Java | Java programming language | Java | Lenguaje de programación Java | Java | زبان برنامهنویسی جاوا | Java | Java (langage) | Linguaxe Java | Java | Java (programski jezik) | Java programozási nyelv | Java | Java (forritunarmál) | Java (linguaggio) | Java言語 | Java პროგრამული ენა | 자바 프로그래밍 언어 | Java (kalba) | Java (valoda) | Јава (програмски јазик) | Java (programmeertaal) | Java (programmeringsspråk) | Java | Java (linguagem de programação) | Java | Java | Programski jezik Java | Java | Java (programspråk) | ஜாவா நிரலாக்க மொழி | ภาษาจาวา | Java programlama dili | Мова програмування Java | Java (ngôn ngữ lập trình) | Java
This article is licensed under the GNU Free Documentation License.
It uses material from the
"Java (Programmiersprache)".
Home Page • arts • business • computers • games • health • hospitals • home • kids & teens • news • physicians • recreation• reference • regional • science • shopping • society • sports • world