Java (Programmiersprache)
Java ist eine objektorientierte, plattformunabhängige Programmiersprache.
Die Urversion von Java, auch Oak genannt, wurde in einem Zeitraum von 18 Monaten vom Frühjahr 1991 bis Sommer 1992 unter dem Projektnamen "The Green Project" von Patrick Naughton, Mike Sheridan und James Gosling sowie zehn weiteren Entwicklern im Auftrage des amerikanischen Computerherstellers Sun Microsystems entwickelt. Einer der Urväter und Hauptentwickler der Sprache war dabei James Gosling.
Das ursprüngliche Ziel bei der Entwicklung von Java war aber nicht lediglich die Entwicklung einer weiteren Programmiersprache, sondern die Entwicklung einer vollständigen Betriebssystemumgebung, inklusive virtueller CPU, für unterschiedlichste Einsatzzwecke.
Die Entwicklung fand in einem anonymen Bürogebäude in der Sand Hill Road in Menlo Park statt. Während dieser abgeschiedenen Entwicklungsphase kam es zu keinem Austausch mit Sun Microsystems. Im Sommer 1992 schließlich war die erste Oak-basierte Anwendung fertiggestellt – "an interactive, handheld home-entertainment device controller with an animated touchscreen user interface".
Diese Technologiedemonstration einer Touchscreen-basierten Gerätesteuerung mit animierter Benutzeroberfläche (GUI) hatte den Namen *7 ("StarSeven"). Der Name Oak hat den Ursprung übrigens in einer Eiche, die vor dem Fenster des Entwicklers James Gosling stand (Oak, engl. für Eiche).
Nach der Vorführung von StarSeven, mit dem zahlreiche Geräte interaktiv gesteuert werden konnten, wurden Unternehmen aus der Kabelfernseh-Branche aufmerksam und aus dem Hinterzimmer-Projekt "The Green Project" entstand die Firma "FirstPerson".
Aus dem Büro wurde ein Bürohaus in der 100 Hamilton Avenue in Palo Alto.
Da die Belegschaft inzwischen von 13 Entwicklern auf 70 Mitarbeiter wuchs und die Zeit für interaktive digitale Mehrwertdienste im Bereich des Kabelfernsehens noch nicht reif war, suchte sich die junge Firma neue Betätigungsfelder.
Nach einem dreitägigen Gruppentreffen von John Gage, James Gosling, Bill Joy, Patrick Naughton, Wayne Rosing und Eric Schmidt in "The Inn at Squaw Creek" bei Lake Tahoe war schnell klar: das Internet war das neue Betätigungsfeld.
Auf Basis des Urvaters aller Webbrowser, Mosaic, wurde ein um Java erweiterter Browser geschaffen – der "WebRunner" (nach dem Film "The Blade Runner"). Später wurde aus "WebRunner" dann der offiziell bekannte HotJava-Browser.
Im März 1995 wurde die erste Alphaversion (1.0a2) des Java-Quellcodes für die Öffentlichkeit freigegeben und die Downloadzahlen explodierten.
Wenig später, am 23. Mai 1995, wurde Java dann erstmals offiziell der Öffentlichkeit vorgestellt, in der "San Jose Mercury News".
Der Durchbruch für Java kam mit der Integration von Java in den Browser Netscape – besiegelt durch einen Handschlag zwischen Eric Schmidt und George Paolini von Sun Microsystems und Marc Andreessen, dem Erfinder und Begründer von Netscape. Ort und Zeit: 4 Uhr morgens in einem Hotelzimmer des Sheraton Palace Hotels in der Nähe des Convention Centers.
Der Name Java hat seinen Ursprung übrigens im Namen einer starken Kaffee-Sorte, die speziell für Espresso Verwendung findet (Java-Bohne) und von den Entwicklern bevorzugt getrunken wurde.
Der Entwurf der Sprache verfolgte vier Hauptziele:
Die Sprache Java ist objektorientiert aufgebaut. 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 managen 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 Wiederverwendung von Softwaremodulen.
Java ist nicht konsequent objektorientiert, so gibt es etliche Grundtypen (int, boolean usw.), die keine Objekte sind (siehe auch Kapitel weiter unten). Diese fügen sich nicht in die Objektstruktur der anderen Klassen ein und fordern oft gesonderte Behandlung.
Beispiele für rein objektorientierte Sprachen gibt es schon länger, beispielsweise Smalltalk oder Self, ein modernes Beispiel ist Ruby.
Java ist plattformunabhängig, d. h. Java-Programme laufen unabhängig vom Betriebssystem und der eingesetzten Hardware. Java-Programme laufen nicht nur auf einem PC, einer Workstation oder einem Server, sondern auch auf Organizern und Handys. Dies wird dadurch erreicht, dass es sich bei einem kompilierten Java-Programm nicht um direkt ausführbaren Maschinencode handelt, sondern um maschinenunabhängigen Bytecode.
Zum Ausführen von Java-Programmen wird eine Laufzeitumgebung (runtime environment) auf Softwarebasis benötigt, die so genannte Java VM (Java Virtual Machine). Es gibt mittlerweile aber auch Hardware-Lösungen, also Prozessoren, deren Maschinensprache selbst der Java-Bytecode ist oder Betriebssysteme, in denen Java integraler Bestandteil ist (z.B. MacOS X).
Java bietet die Möglichkeit, Klassen zu schreiben, die in unbekannten Containern ablaufen. Beispielsweise lassen sich Applets in Web-Browsern, 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. Beispiele für Java Container-Module sind:
Wichtigstes Merkmal von Java ist sein Sicherheitskonzept, das aus drei Schichten besteht:
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 Packages können – ähnlich wie innerhalb einer Klasse unter anderem durch
Weiter unterstützt die Sprache Threads (gleichzeitig ablaufende Programmteile) und Ausnahmenn (englisch exception) und Java beinhaltet auch einen Garbage-Collector, der nicht (mehr) referenzierte Objektinstanzen aus dem Speicher entfernt.
Bemerkenswert ist auch die explizite Unterscheidung von Schnittstellen und Klassenn. Eine Klasse kann beliebig viele Schnittstellen implementieren, ist aber stets die Spezialisierung genau einer Basisklasse. Alle Klassen sind – direkt oder indirekt – von der Wurzelklasse
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, das zur Erzeugung plattformunabhängiger graphischer Benutzerschnittstellen (GUI) dient und auf AWT basiert, bereitstellen.
Ein Beispielprogramm, das eine Meldung auf der Konsole ausdruckt:
Grunddatentypen, die auch als 'primitive' oder 'elementare' Datentypen bezeichnet werden, sind in Java die einzigen Datenstrukturen, die keine Objekte sind. Sie sind ebenfalls plattformunabhängig (sie werden stets im Big Endian-Format gespeichert, wenn sie größer als 8 Bit sind). Um dennoch auch primitive Datentypen als echte Objekte behandeln zu können, existiert für jeden einzelnen eine entsprechende Wrapperklasse, deren Benutzung jedoch erheblich inperformanter ist.
Allgemeines - Historisches
Grundkonzepte der Sprache
Objektorientierung
Plattformunabhängigkeit
Modulare Ausführung auf fernen Computern
Merkmale der Sprache
Der Objektzugriff in Java ist über Referenzen genannte Zeiger implementiert, aus Sicherheitsgründen ist es jedoch nicht möglich, mit ihnen zu rechnen, so genannte Pointerarithmetik ist also nicht in der Sprache enthalten.private
und public
– geregelt werden.Object
abgeleitet.Syntax
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hallo Welt!");
}
}
99 Bottles of Beer in Java:
public class Bottles {
public static void main(String args[]) {
String s = "s";
for(int beers = 99; beers > -1;) {
System.out.print(beers + " bottle" + s + " of beer on the wall, ");
System.out.println(beers + " bottle" + s + " of beer, ");
if(beers == 0) {
System.out.print("Go to the store, buy some more, ");
System.out.println("99 bottles of beer on the wall.\
");
System.exit(0);
}
else
System.out.print("Take one down, pass it around, ");
s = (--beers == 1) ? "" : "s";
System.out.println(beers + " bottle" + s + " of beer on the wall.\
");
}
}
}
Die Grammatik von Java ist in der Java Language Specification dokumentiert.Grunddatentypen
Datentyp | Größe | Wrapper-Klasse | Wertebereich | Beschreibung |
---|---|---|---|---|
boolean | 1 bit | java.lang.Boolean | true oder false | Boolescher Wahrheitswert |
byte | 8 bit | java.lang.Byte | -128 bis 127 | Zweierkomplement mit Vorzeichen |
char | 16 bit | java.lang.Character | 0 bis 65.535 (z. B. 'A') | Unicode-Zeichen ohne Vorzeichen |
double | 64 bit | java.lang.Double | +/-4,9E-324 bis +/-1,7E+308 | Gleitkommazahl (IEEE 754) |
float | 32 bit | java.lang.Float | +/-1,4E-45 bis +/-3,4E+38 | Gleitkommazahl (IEEE 754) |
int | 32 bit | java.lang.Integer | -2.147.483.648 bis 2.157.583.647 | Zweierkomplement mit Vorzeichen |
long | 64 bit | java.lang.Long | -9.223.372.036.854.775.808 bis 9.223.372.036.854.775.807 | Zweierkomplement mit Vorzeichen |
short | 16 bit | java.lang.Short | -32.768 bis 32.767 | Zweierkomplement mit Vorzeichen |
Die Klasse selbst, innere Klassen | Klassen im selben Package | Unterklassen | Sonstige Klassen | |
---|---|---|---|---|
private | Ja | Nein | Nein | Nein |
default | Ja | Ja | Nein | Nein |
protected | Ja | Ja | Ja | Nein |
public | Ja | Ja | Ja | Ja |
abstract
, final
, static
sind Polymorphie-Modifizierer.
static
kann vor allen Membern außer Konstruktoren stehen und bedeutet, dass der betreffende Member im Kontext der Klasse verwendbar ist und kein Objekt benötigt.
abstract
kann vor Klassen und Methoden stehen und bedeutet, dass dem betreffenden Member Implementierung fehlt. Unterklassen sind gezwungen, sich selbst als abstrakt zu deklarieren oder die fehlende Implementierung zu liefern.
final
kann vor allen Membern außer Konstruktoren stehen und bedeutet, dass der betreffende Member nicht mehr verändert werden darf. Finale Variablen sind ähnlich wie Konstanten, finale Methoden dürfen von Subklassen nicht überschrieben werden und von finalen Klassen darf man erst gar keine Subklassen bilden.
native
kann nur vor Methoden stehen und bedeutet, dass die Implementierung der betreffenden Methode nicht in Java, sondern einer anderen Programmiersprache geschrieben wurde, und von der Virtuellen Maschine über eine Laufzeitbibliothek (DLL oder SO) gelinkt werden muss.
strictfp
kennzeichnet Klassen und Methoden, deren enthaltene Fließkommaoperationen streng nach IEEE ablaufen müssen.
package
deklariert die Paket-Zugehörigkeit der nicht-geschachtelten Top-Level-Klassen einer Quelltextdatei.
import
importiert Symbole (derzeit nur Klassen, ab 5.0 auch statische Member), so dass sie ohne voll qualifizierten Namen verwendet werden können.
boolean
, char
, byte
, short
, int
, long
, float
, double
, enum
(ab 5.0) und void
sind Typen. void
ist der Nichtstyp, notwendig, um Methoden ohne Rückgabewerte zu kennzeichnen. Für die primitiven Typen: siehe oben.
class
, enum
, interface
und @interface
dienen zur Deklaration eigener Typen: Klassen, Enums (Aufzählungstyp für typsichere Aufzählung, engl. typesafe enumeration), Interfaces (Schnittstellen für Klassen) und Annotations für Metadaten. enum
und @interface
sind mit Java 5.0 in die Sprache aufgenommen worden.
try
, catch
, finally
, throw
, throws
beziehen sich auf die Ausnahmebehandlungbehandlung (englisch exception handling). Mit throw
wird eine Ausnahme ausgelöst. Alle eventuell ausgelösten Ausnahmen einer Methode, die nicht von RuntimeException
oder Error
abstammen, müssen mit throw
s in der Deklaration der Methode (Signatur) angegeben werden. Es handelt sich also um so genannte checked exceptions. Mit try
umschließt man einen Block, in dem eventuell eine Ausnahme auftreten könnte. Mit catch
fängt man nach einem try
-Block die dort aufgetretene Ausnahme ab, mit finally
hängt man an einen try
- oder catch
-Block einen Block für Aufräumarbeiten an (z. B. Schließen von Dateien).
extends
und implements
dienen der Vererbung: extends
der genetischen Erweiterungsvererbung von Klasse zu Klasse oder Interface zu Interface und implements
der Implementierungsvererbung von Interface zu Klasse. Außerdem wird extends
bei Generics für Typerweiterung verwendet.
super
und this
beziehen sich im Objekt-Kontext auf das aktuelle Objekt in seinem tatsächlichen Morph (this
) bzw. im Morph der Superklasse (super
). this
wird verwendet, um in Konstruktoren überladene Konstruktoren aufzurufen und um bei Membernamenskonflikten explizit auf die von weiter innen liegenden Membern verdeckten Member zu verweisen. super
wird in Konstruktoren zum Aufruf des Superklassenkonstruktors und in überschreibenden Methoden zum Aufruf der überschriebenen Methode verwendet. Außerdem wird super
bei Generics für Typeingrenzung verwendet.
new
reserviert Speicher für neue Objekte (inklusive Arrays) auf dem Heap.
if
, else
, switch
, case
, default
, while
, do
, for
, break
, continue
dienen der Bedingungsprüfung und Schleifensteuerung und bedienen sich einer imperativen Syntax.
return
liefert Werte aus einer Methode an die aufrufende Methode zurück.
volatile
ist ein Modifizierer für nicht-lokale Variablen und verbietet dem JIT-Compiler Registeroptimierungen auf diese Variable, weil mehrere Threads sie gleichzeitig verwenden könnten (insbesondere im Kontext nativer Methoden).
synchronized
verwendet ein Objekt als Semaphor mit Lock-Pool und sorgt so dafür, dass jeglicher mit synchronized
an denselben Semaphor gebundener Code nur ein einziges Mal gleichzeitig ausgeführt werden kann. Alle anderen Threads, die solche Code-Blöcke ausführen möchten, werden solange blockiert, bis der Semaphor wieder frei ist. Des weiteren dient es auch der Synchronisation eventuell vorhandener lokaler Caches bei Multiprozessormaschinen.
transient
kennzeichnet nicht-persistente Variablen, die automatisch serialisiert werden dürfen.
instanceof
ist ein Java-Operator, der prüft, ob ein Objekt Instanz eines Typs oder Subtyps ist.
Die Syntax von C# entspricht in großen Teilen der Syntax von Java, konzeptionelle Unterschiede bestehen insbesondere in der Unterstützung von Delegierten (engl. delegates), ein Konzept, das am ehesten mit Funktionszeigern vergleichbar ist (so genannte Callbacks), 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). Um an C# möglichst viele Programmierer zu binden, enthält die Sprache auch Bestandteile der Sprachen VisualBasic (z.B. Eigenschaften bzw. properties) sowie C++ (z.B. enums).
Um auch systemnahe Programmierung zu ermöglichen, besteht in .NET die Möglichkeit, auch so genannten unsicheren unmanaged code zu verwenden. Somit können API-Aufrufe des Systems ausgeführt werden, aber der Programmierer ist für die Ressourcenverwaltung verantwortlich.
Außerdem wird hierdurch die theoretische Plattformunabhängigkeit eingeschränkt bzw. unmöglich. Bislang werden außer Microsoft eigenen Betriebssystemen (ab Windows NT 4 SP 6) von Microsoft offiziell keine weiteren Betriebssysteme unterstützt.
Die Projekte Mono (von Ximian-Technik-Guru Miguel de Icaza) und DotGNU versuchen seit längerem weitere Plattformen zu erreichen, wobei das Mono-Projekt mittlerweile in den wichtigsten Teilbereichen eine Unterstützung bietet (z.B. ASP.NET und die BCL).
Änderungen an der Spezifikation von Java werden durch den Java Community Process (JCP) geregelt. Für vorgeschlagene Änderungen wird ein Java Specification Request (JSR) erstellt, der verschiedene Phasen durchläuft, bevor die Änderungen in Java Einzug halten. (Homepage des Java Community Process)
Java 5.0 soll im Sommer 2004 als Nachfolger der Version 1.4 erscheinen – ursprünglich sollte die Version 1.5.0 lauten. Seit Juni 2004 ist J2SE 5.0 Beta 2 erhältlich. Es wird über folgende Neuerungen in der Sprache Java verfügen:
Außerdem kann davon ausgegangen werden, dass sich Java im Laufe der Zeit zu einer aspektorientierten Programmiersprache wandeln wird.
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.
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 und JBuilder von Borland am verbreitetsten, sowie die Freeware JCreator. 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 wird.
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.
Siehe auch: Cocoon, Schlüsselwörter der Programmiersprache Java
Abgrenzung zu anderen Sprachen
JavaScript
Java ist nicht mit der Programmiersprache JavaScript zu verwechseln, die ebenfalls in Web-Browsern verwendet wird.
Sie hat eine ähnliche Syntax, kennt aber keine Vererbung.
Objekte werden in JavaScript prototypenbasiert definiert.
JavaScript ist, wie der Name sagt, eine reine Skriptsprache.
Es existieren Implementationen vor allem in Web-Browsern, aber auch alleinstehende Ausführungsumgebungen sind vorhanden.C++
Im Gegensatz zu C++ fanden komplexe Konstrukte, wie Mehrfachvererbung oder die fehleranfällige Zeigerarithmetik keinen Einzug. Auch um die Speicherverwaltung braucht man sich als Java-Entwickler in der Regel keine Gedanken zu machen, dies erledigt der so genannte Garbage-Collector. Spätestens beim Einsatz von Java in Embedded Systems, z.B. über OSGi muss allerdings auch hier der Programmierer sich entsprechende Gedanken machen.C#
C# (gesprochen: ßie-scharp oder auch ziss) kann als Kampfansage von Microsoft an Sun Microsystems Java gesehen werden. Mit der Spezifikation von C#, im Rahmen seiner .NET (gesprochen: dott-nett) Strategie, hat Microsoft versucht, den Spagat zu schaffen zwischen dem kompletten Neuanfang einer Sprache und der leichten Integration bisher bestehender Komponenten.Die nächsten Versionen der Sprache Java
Das für Java 1.5 (jetzt 5.0) geplante JSR 203 wurde auf Java 1.6 verschoben.Versionen
Ab diesem Zeitpunkt spricht man von der Java 2 Platform, Standard Edition (J2SE) und statt Java Development Kit (JDK) heißt es Java 2 Software Development Kit (J2SDK).
java.lang
: elementare Klassen, z.B. Object
und System
java.io
: Ein- und Ausgabe
java.util
: z.B. Datenstrukturen und eine Datumsklasse
java.net
: einfache TCP/IP-Klassen
java.awt
: grundlegene Klassen für grafische Benutzeroberflächen
java.applet
: eine Klasse für die bekannten Applets.
BigInteger
und BigDecimal
)
Siehe auch: Servlet, Java Web Start, Java Server Pages, J2EE, J2ME, JavaDoc, BlackdownEntwicklungsumgebungen
Literatur
Tutorial
Weblinks