Java (Programmiersprache)
Java
| |
---|---|
![]() | |
Basisdaten
| |
Entwickler | Sun Microsystems |
Erscheinungsjahr | 1995 |
Aktuelle Version | 5.0 (30. September 2004) |
Betriebssystem | Windows, Linux, Mac OS X, Solaris |
Kategorie | Objektorientierte Programmiersprache |
Lizenz | BCL |
deutschsprachig | ja |
java.sun.com |
Java ist eine objektorientierte Programmiersprache und als solche ein eingetragenes Warenzeichen der Firma Sun Microsystems. Java-Programme benötigen zur Ausführung eine spezielle Umgebung, die Java-Laufzeitumgebung oder Java-Plattform genannt wird und als wichtigsten Bestandteil die Java Virtual Machine enthält. Der Vorteil ist, dass nur diese Umgebung an verschiedene Computer und Betriebssysteme angepasst werden muss. Sobald dies geschehen ist, laufen auf der Plattform alle Java-Programme in der Regel ohne oder mit nur geringen Anpassungsarbeiten. Die Programmiersprache Java ist eine Komponente der Java-Technologie.
Grundkonzepte der Sprache
Der ursprüngliche Entwurf der Programmiersprache Java strebte im wesentlichen fünf Ziele an.
- Sie soll eine objektorientierte Programmiersprache sein.
- Sie soll es ermöglichen, das gleiche Programm auf unterschiedlichen Computersystemen auszuführen.
- Sie soll eingebaute Unterstützung für die Verwendung von Computernetzen enthalten.
- Sie soll Code aus entfernten Quellen sicher ausführen können. Dieser Punkt wird über das Sicherheitskonzept von Java erreicht, das aus drei Schichten besteht:
- dem Code-Verifier (deutsch "Code-Überprüfer"), der sicherstellt, dass die VM keinen ungültigen Bytecode ausführen kann.
- den Class-Loadern (deutsch "Klassenlader"), die die sichere Zuführung von Klasseninformationen zur JVM steuern (diese ist dabei kein Interpreter, siehe unten).
- den Security-Managern (deutsch "Sicherheitsverwalter"), die sicher stellen, dass nur Zugriff auf Programmobjekte erlaubt wird, für die entsprechende Rechte vorhanden sind.
- Die erfolgreichen Aspekte bereits verbreiteter objektorientierter Programmiersprachen wie C++ sollen auch für Java-Programmierer zur Verfügung stehen.
Objektorientierung
Die Sprache Java gehört zu den objektorientierten Programmiersprachen. Die Grundidee der objektorientierten Programmierung ist die softwaretechnische Abbildung in einer Art und Weise, wie wir Menschen auch Dinge der realen Welt erfahren. Die Absicht dahinter ist, große Softwareprojekte einfacher verwalten zu können, und sowohl die Qualität von Software zu erhöhen als auch Fehler zu minimieren. Ein weiteres Ziel der Objektorientierung ist ein hoher Grad der Wiederverwendbarkeit von Softwaremodulen.
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.
Obwohl Java vollständige Objektorientierung unterstützt, sind die Grunddatentypen (int, boolean usw.) und Literale keine Objekte (siehe auch Kapitel weiter unten).
Reflection
Java bietet eine Reflection-API als Bestandteil der Laufzeitumgebung. 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.
Annotationen
Seit Java 5.0 gibt es eine Syntax-Erweiterung namens Annotationen. Sinn der Annotationen ist die automatische Erzeugung von Code und anderen in der Software-Entwicklung wichtigen Dateien für wiederkehrende Muster anhand möglichst kurzer Hinweise im Quelltext. Bislang wurden in Java dafür ausschließlich Javadoc-Kommentare mit speziellen JavaDoc-Tags verwendet, die von Doclets wie z. B. dem XDoclet ausgewertet wurden.
Diese Annotationen können auch in den kompilierten Class-Files 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.
Write Once, Run Anywhere
Java funktioniert nach dem Konzept Write Once, Run Anywhere (deutsch: Schreibe einmal, laufe überall). Das bedeutet, dass man ein Programm, das in Java programmiert wurde, nur einmal kompilieren braucht und es auf allen anderen Systemen, die eine Java-Laufzeitumgebung (Java Runtime Environment bzw. JRE) besitzen, läuft. Dies wird dadurch erreicht, dass Java zunächst in Bytecode kompiliert wird, dieser wird von der JRE beim Starten des Programmes erst in die Maschinensprache kompiliert (Man spricht hier von einem JIT-Compiler).
Der Bytecode funktioniert also als Zwischencode, zwischen Programmiersprache und Maschinensprache. So ist das Javaprogramm nicht an eine bestimmte Maschine gebunden. Die 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 Desktopbetriebssysteme, sondern auch für viele Embedded 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).
Fälschlicherweise wird oft behauptet, dass Java plattformunabhängig sei, dies ist jedoch nicht richtig, da Java von der Java-Plattform abhängt. Diese lässt sich eben nur auf verschiedene Architekturen und Betriebssysteme portieren.
Modulare Ausführung auf fernen Computern
Java bietet die Möglichkeit, Klassen zu schreiben, die in unbekannten Containern ablaufen. Beispielsweise lassen sich Applets 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 bei Applets wichtig ist (siehe auch Sandbox). Beispiele für Java Container-Module sind Applets, Servlets, Portlets, Midlets, Translets, Doclets und Enterprise JavaBeans.
Merkmale der Sprache
Der Objektzugriff in Java ist über Referenzen genannte Zeiger implementiert; aus Sicherheitsgründen ist es nicht möglich, deren Speicheradresse zu modifizieren. So genannte Pointerarithmetik ist mit der Sprache also ausgeschlossen. Per Design können so häufig auftretende Fehler während des Entwicklungsprozesses von vornherein ausgeschlossen werden.
Um große Projekte strukturieren zu können und saubere Schnittstellen zu Bibliotheken zu schaffen, können die Klassen zu Paketen (englisch packages) zusammengefasst werden. Die Zugriffe auf Klassen und Methoden eines fremden Paketes können – ähnlich wie innerhalb einer Klasse unter anderem durch private
und public
– geregelt werden.
Weiter unterstützt die Sprache Threads (gleichzeitig ablaufende Programmteile) und Ausnahmen (englisch exception) und Java beinhaltet auch einen Garbage-Collector, der 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.1 wurden die Java Foundation Classes (JFC) eingeführt, die u. a. Swing bereitstellen, das zur Erzeugung plattformunabhängiger grafischer Benutzerschnittstellen (GUI) dient und auf AWT basiert.
Syntax
Ein Beispielprogramm, das eine Meldung auf der Konsole ausgibt:
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.
Unterschiede zu ähnlichen Sprachen
JavaScript
Java ist nicht mit der reinen Skriptsprache JavaScript zu verwechseln, die vornehmlich in HTML-Seiten zur eingebetteten Programmierung verwendet wird. Sie hat eine ähnliche Syntax, unterscheidet sich jedoch in vielerlei Hinsicht und kann insbesondere nicht für die Konstruktion größerer, kompletter Anwendungen verwendet werden. Objekte werden in JavaScript prototypenbasiert definiert. Es gibt Implementierungen vor allem in Web-Browsern, aber auch unabhängige Ausführungsumgebungen sind vorhanden.
Smalltalk
Smalltalk ist eine der ältesten objektorientierten Programmiersprachen überhaupt und der eigentliche Vater von Java. Sun hat sich jedoch für die C++ Syntax entschieden und gleichzeitig verlauten lassen, Java würde von C++ abstammen. Der Grund für diesen Schachzug war die größte Hürde für eine neue Programmiersprache: Die Akzeptanz der Programmierer zu erlangen. Dies war mit der Anlehnung an eine sehr bekannte Sprache mit geläufiger Syntax einfacher.
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 Garbage Collection und der virtuellen Maschine übernommen sowie eine Vielzahl weiterer Features der Sprache Smalltalk.
Smalltalk kennt jedoch keine primitiven Datentypen wie z. B. 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 z. B. Eclipse auch für Java existiert.
C++
Java lehnt an die objektorientierten Programmiersprache C++ an. Im Gegensatz zu C++ fanden jedoch komplexe Konstrukte wie Mehrfachvererbung oder die fehleranfällige Zeigerarithmetik keinen Einzug. Die interne Speicherverwaltung wird dem Java-Entwickler weitgehend abgenommen; dies erledigt der so genannte Garbage-Collector. Deshalb ist Java in vielen Fällen leichter zu handhaben als C++. Allerdings garantiert auch dieser Mechanismus nicht den vollständigen Ausschluss von Speicherlecks. Letztlich muss der Programmierer dafür sorgen, dass nicht mehr verwendete Objekte nirgends mehr referenziert werden.
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 Indexoperator []
) zu überladen, das heißt in einem bestimmten Kontext mit neuer Bedeutung zu versehen. Dies sorgt für eine Vereinfachung der Sprache an sich und verhindert, dass Quellcodes mit Operatoren, die mit schwer nachvollziehbarer Semantik überladen werden, unlesbar gemacht werden.
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 sogenannte „Generics“, die zwar keinerlei Metaprogrammierung erlauben, aber ähnlich wie C++-Templates typsichere Container und ähnliches ermöglichen.
C#
C# (gesprochen: engl. "C sharp" bzw. dt. "ßieh Scharp"), entwickelt von Microsoft, kann als Konkurrenzprodukt zu Java gesehen werden. Mit der Spezifikation von C# hat Microsoft im Rahmen seiner .NET-Strategie versucht, den Spagat zwischen dem kompletten Neuanfang einer Sprache und der leichten Integration bisher bestehender Komponenten zu schaffen.
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"), ein 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"; z. B. int
, struct
) und Referenztypen (engl. "reference types", z. B. 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 (z. B. Eigenschaften bzw. properties) sowie C++ (z. B. enums). 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.
---max
Um auch systemnahe Programmierung zu ermöglichen, besteht in .NET die Möglichkeit, auch so genannten unsicheren unmanaged code zu verwenden, ähnlich Javas JNI.
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 sogenannten Shared Source-Lizenz (Quellcode-Modifikationen dürfen nicht weitergegeben werden) veröffentlich wurde, weswegen das Mono-Projekt und DotGNU eigene Implementierungen vorantreibt. Dabei werden auch weitere Betriebssysteme unterstützt. Dies wird dadurch vereinfacht, dass C# standardisiert ist.
Entwicklungsumgebungen
Es gibt eine große Vielfalt von Entwicklungsumgebungen für Java, sowohl kommerzielle als auch freie (Open Source). Die meisten Entwicklungsumgebungen für Java sind selbst ebenfalls in Java geschrieben.
In Form von z. B. OSGi finden sich inzwischen auch eigenständige Entwicklungsframeworks, die verschiedene Konzepte von Java unabhängig hiervon weiterentwickeln – Eclipse basiert beispielsweise auf OSGi. OSGi selbst spezifiziert das Bundle-Konzept, einen service-orientierten Ansatz, um dynamische Nachladbarkeit und Versionsmanagement von Java-Klassen zu ermöglichen (z.B. für Embedded Java-Anwendungen). Hierzu gehört auch das Remote Management von Plattformen, um Service Delivery und Wartung (Updates aus der Ferne) zu ermöglichen.
Die bekanntesten Open-Source-Umgebungen sind Eclipse, jEdit 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 MacOS 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 oder Jed gibt es ebenfalls entsprechende Modes.
Compiler
Mit einem Java-Compiler ist es möglich, Java-Sourcecode (Dateiendung .java) in einen ausführbaren Code zu kompilieren. Grundsätzlich unterscheidet man zwischen Bytecode- und Nativecode-Compilern. Des weiteren verwenden einige Java-Laufzeitumgebungen einen JIT-Compiler um Bytecode häufig genutzter Programmteile in nativen Maschinencode zu übersetzen während das Programm läuft.
Bytecode-Compiler
Java-Programme werden im Normalfall in einen nicht direkt ausführbaren Bytecode (Dateiendung .class) übersetzt, den Maschinencode der Java Plattform, der mit der Java Runtime Environment (JRE) ausgeführt wird. Es ist dabei festzuhalten, dass diese Ausführung von Bytecode nichts mit einem Interpreter zu tun hat, wie er z.B. in Basic zum Einsatz kommt. Die aktuelle HotSpot-Technologie compiliert den Bytecode zur Laufzeit vielmehr in nativen Prozessorcode und optimiert diesen auch noch abhängig von der verwendeten Plattform. Diese Optimierung findet dabei sukzessive statt, so dass der Effekt auftritt, dass Programmteile erst nach mehrmaliger Abarbeitung schneller werden. Auf der anderen Seite führt diese Technologie, die ein Nachfolger der Just-In-Time-Compilierung ist, dazu, dass Java-Bytecodes mindestens genau so schnell wie native, compilierte Programme ausgeführt werden.
Die HotSpot-Technologie ist seit der JRE Version 1.3.x verfügbar und wurde seitdem immer weiter verbessert.
- javac (Teil des JDK) von Sun Microsystems
- Jikes von IBM
Native Compiler
Es existieren auch Compiler für Java, die Java-Quelltexte oder Java-Bytecode in normalen Maschinencode übersetzen können, sogenannte Ahead-Of-Time-Compiler. Nativ kompilierte Programme haben den Vorteil, keine JavaVM mehr zu benötigen, aber auch den Nachteil, nicht mehr plattformunabhängig zu sein. Hier trifft die Bezeichnung "write once, run anywhere" nicht mehr zu.
Wrapper
Ein Wrapper ist ein ausführbares Programm, welches als Ersatz für eine JAR-Datei (Dateiendung .jar) dient. Er sucht selbständig nach einer installierten Java-Laufzeitumgebung, um das Programm zu starten und informiert den Benutzer darüber, wo er eine Laufzeitumgebung herunterladen kann, falls noch keine installiert ist. Es ist also immer noch eine Laufzeitumgebung nötig, um das Programm starten zu können.
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.
- JSmooth (Lizenz: GPL)
- Launch4J (Lizenz: LGPL)
- JBuilder von Borland und NSIS (Java Launcher) sind ebenfalls in der Lage einen Wrapper für Windows zu erstellen
Literatur
- James Gosling, Bill Joy, Guy Steele, Gilad Bracha: The Java Language Specification. Second Edition.
- David Flanagan: Java in a Nutshell (Deutsche Ausgabe). O'Reilly, 2002, ISBN 3-89721-332-X
- Christian Ullenboom: Java ist auch eine Insel. Galileo Computing, 2004, ISBN 3-89842-526-6 (Online-Buch)
- Cay Horstmann, Gary Cornell: Core Java 2. Band 1 - Grundlagen Einführung in die objektorientierte Programmierung. ISBN 3-8273-2216-2
- Guido Krüger: Handbuch der Java-Programmierung. Addison-Wesley, 2002, ISBN 3-8273-1949-8 (Freier Download)
- Friedrich Esser: Java 2 – Designmuster und Zertifizierungswissen, Galileo Computing, 2001, ISBN 3-9343-5866-7 (Online-Buch)
- Boris Schäling: Programmieren in Java (Online-Buch)
- Bruce Eckel: Thinking in Java, Prentice-Hall, 2002, ISBN 0-1310-0287-2 (Online-Buch, Englisch)
- Joshua Bloch: Effective Java Programming Language, Addison-Wesley, 2001, ISBN 0201310058
- Dietrich Boles, Cornelia Boles: Objektorientierte Programmierung spielend gelernt mit dem Java-Hamster-Modell, Teubner, 2004, ISBN 3-519-00506-9
- Ralph Steyer: Java 2 - M+T Pocket, Das Programmier-Handbuch, ISBN: PDF-3-8272-6106-6, Markt & Technik, 2003 (Online-Buch)
- Dirk Louis & Peter Müller: Java 5 Kompendium - Praxis der objektorientierten Programmierung, Markt & Technik, 2005, ISBN 3-8272-6844-3
Siehe
Geschichte
Wikipedia-Artikel zur geschichtlichen Entwicklung von Java:
- Star Seven, das erste Gerät mit Java-Interpreter (damals noch Oak)
Programmiersprachen
Programmiersprachen, die sich an Java anlehnen und Bytecode generieren:
Java für Embedded Systems
Java Frameworks
Java-basierte Plattformen
- Multimedia Home Platform (MHP)
- MIDP
Weblinks
- Java-Abteilung von Sun Microsystems (Englisch)
- Download Java (Englisch)
- Kaffee & Kuchen Deutsche Java-Seite mit News & Workshops
- Entwicklung einer Java-VM für .NET
Tutorien
- Interaktives Java Tutorial von Bradley Kjells (dt./engl.), einsteigerfreundliche Einführung in Java
- Java Tutorial von Sun (engl.)
- Erstellen von Spielen und Bewegung mit Java 1.4: javacooperation (deutsch/englisch/russisch)
- Ralph Steyer, Das Java 2 Magnum. ISBN 3-8272-6242-9, Markt & Technik, o.O. o.J. - ist vollständig online gestellt Java Magnum.
- Handbuch der Java-Programmierung von Guido Krüger
- Java-Dokumentation der aktuellen Version J2SE 1.5 (Englisch, inkl. Sprachdefinition und Standard-API)
- Bruce Eckel's Free Electronic Books: Thinking in Java 1st Edition, Thinking in Java 2nd Edition, Thinking in Java 3rd Edition, Thinking in Enterprise Java