Java (Programmiersprache)
Java ist eine objektorientierte, plattformunabhängige Programmiersprache.
Geschichtlicher Hintergrund
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 die Entwicklung einer weiteren Programmiersprache, sondern die Entwicklung einer geräteunabhängigen Entwicklungs-Plattform für Geräte aus dem Unterhaltungsbereich, allen voran digitalen Settop-Boxen für den Empfang von interaktiven Mehrwertdiensten mittels Kabelfernsehen.
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 inzwischen aus den 13 Entwicklern 70 Personen wurden 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 Alpha-Version (1.0a2) des Java Source Codes für die Öffentlichkeit freigegeben und die Download-Zahlen 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 in der Bezeichnung für eine starke Kaffee-Sorte, die speziell für Espressos Verwendung findet (Java-Bohne).
Grundkonzepte der Sprache
Der Entwurf der Sprache verfolgte vier Hauptziele:
- Objektorientierung
- Plattformunabhängigkeit (d.h. Unabhängigkeit vom Betriebssystem und von Hardware)
- Vernetzbarkeit
- Sichere Ausführung auf entfernten Computern
Objektorientierung
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.
Plattformunabhängigkeit
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 Handies. 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 ein Stück Software, die so genannte Java VM benötigt. Es gibt mittlerweile aber auch Hardware-Lösungen, also Prozessoren, deren Maschinensprache selbst der Java-Bytecode ist.
Modulare Ausführung auf entfernten Computern
Java bietet die Möglichkeit, Klassen zu schreiben, die in unbekannten Containern ablaufen. Beispielsweise lassen sich Applets in Web-Browsern, die Java unterstützen abspielen.
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
Features der Sprache
Wichtigstes Merkmal von Java ist sein Sicherheitskonzept, das aus 3 Schichten besteht:
- dem Code Verifier, der sicherstellt, dass die VM keinen ungültigen Byte-Code ausführen kann.
- den Class Loadern, die die sichere Zuführung von Klasseninformationen zum Interpreter steuern
- den Security Managern, die sicher stellen, dass nur Zugriff auf Programmobjekte erlaubt wird, für die entsprechende Rechte vorhanden sind.
Um die Sicherheit des Speichers sicher zu stellen, sind Pointer in Java nicht implementiert. Statt dessen ist Objektzugriff über Referenzen implementiert.
Um große Projekte strukturieren zu können und saubere Schnittstellen zu Bibliotheken zu schaffen, können die Klassen zu Paketen (Packages) zusammengefasst werden. Die Zugriffe auf Klassen und Methoden eines fremden Packages können - ähnlich wie innerhalb einer Klasse durch private und public - geregelt werden.
Weiter unterstützt die Sprache Threads (gleichzeitig ablaufende Programmteile) und Exceptions (wörtlich: Ausnahmesituationen, das sind Objekte, die bei der Unterbrechung des Programm-Ablaufes an die nächst höhere aufrufende Methode weitergereicht werden.)
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.
Syntax
Ein Beispielprogramm, das eine Meldung auf der Konsole ausdruckt:
public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world!"); } }
Grunddatentypen
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):
- boolean (Werte sind true und false)
- char (16-bit Unicode-Wert, ohne Vorzeichen)
- byte (8 bit, Zweierkomplement-Darstellung, mit Vorzeichen)
- short (16-Bit Ganzzahl, Zweierkomplement-Darstellung, mit Vorzeichen)
- int (32-Bit Ganzzahl, Zweierkomplement-Darstellung, mit Vorzeichen)
- long (64-Bit Ganzzahl, Zweierkomplement-Darstellung, mit Vorzeichen)
- float (Gleitkommazahl 32 Bit, IEEE 754)
- double (Gleitkommazahl 64 Bit, IEEE 754)
Beispiele für literale Werte:
- 'c' char
- true boolean
- false boolean
- 123 int
- 5230L long
- 12.730 double
- 12.730D double
- 12.730F float
- 12.730e3 double
Für die primitiven Typen existieren in Java entsprechende Wrapperklassen zum Instanzieren von Objekten.
Liste der reservierten Worte
abstract assert boolean break byte case catch char class const continue default do double else extends false final finally float for goto if implements import instanceof int interface long native new null package private protected public return short static strictfp super switch synchronized this throw throws transient true try void volatile while
Funktion der reservierten Worte
const
und goto
sind zwar reserviert, aber ohne Funktion, also keine Schlüsselwörter im eigentlichen Sinn. Sie dienen lediglich dem Copmiler zur Ausgabe sinnvoller Fehlermeldungen für Umsteiger von C / C++.
true
, false
und null
sind Literale, jedoch ebenfalls eigentlich keine Schlüsselwörter im engeren Sinn.
Mit assert
werden Assertions realisiert.
private
, protected
und public
sind Zugreifbarkeitsmodifizierer:
Die Klasse selbst, Innere Klassen | Klassen im selben Package | Subklassen | Sonstige Klassen | |
---|---|---|---|---|
private | Ja | Nein | Nein | Nein |
- ("package 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. Subklassen 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 garkeine 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 1.5 auch statische Member).
boolean
, char
, byte
, short
, int
, long
, float
, double
und void
sind Typen. void
ist der Nichtstyp, notwendig, um Methoden ohne Rückgabewerte zu kennzeichnen. Für die primitiven Typen: siehe oben.
try
, catch
, finally
, throw
, throws
beziehen sich auf's Exception Handling. Mit throw
wird eine Exception ausgelöst. Alle eventuell ausgelösten Exceptions einer Methode, die nicht von RuntimeException
oder Error
abstammen, müssen mit throws
in der Deklaration der Methode (Signatur) angegeben werden. Mit try
umschließt man einen Block, in dem eventuell eine Exception auftreten könnte. Mit catch
fängt man nach einem try
-Block die dort aufgetretene Exception 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).
class
und interface
dienen zur Deklaration eigener Typen: Klassen und Interfaces.
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.
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, 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.
new
reserviert für neue Objekte (inkl. Arrays) neuen Speicher auf dem Heap.
if
, else
, switch
, case
, default
, while
, do
, for
, break
, continue
sind für die imperative Syntax, dienen also der Bedingungsprüfung und Schleifensteuerung.
return
liefert Werte an eine 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.
synchronized
verwendet ein Objekt als Semaphor mit Lock-Pool und sorgt so dafür, dass an jeglicher mit synchronized
an denselben Semaphor gebundener Code nur ein einziges Mal gleichzeitig ausgeführt werden kann. Alle anderen Threads, die solche Code-Blöck ausführen möchten, werden solange blockiert, bis der Semaphor wieder frei ist.
transient
kennzeichnet nicht-persistente Variablen, die bei der Serialisierung nicht automatisch serialisiert werden dürfen.
instanceof
ist ein Java-Operator, der prüft, ob ein Objekt Instanz eines Typs ist.
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 Zeigerarithmetik in Java keinen Einzug. In Java fand man weniger fehleranfällige Lösungen. Auch um die Speicherverwaltung braucht man sich als Java-Entwickler in der Regel keine Gedanken zu machen, dies erledigt der so genannte Garbage Collector.
C#
C# (gesprochen: si sharp oder auch cis) kann als Kampfansage von Microsoft an Java gesehen werden. Mit der Spezifikation von C#, im Rahmen seiner .NET (gesprochen: "dot-net") Strategie, hat Microsoft versucht, den Spagat zu schaffen zwischen dem kompletten Neuanfang einer Sprache und der leichten Integration bisher bestehender Komponenten und Wissens. Die Syntax von C# ist Java sehr ähnlich, konzeptuelle Unterschiede sind auch gering. Ein wichtiger Unterschied ist, dass C# keine Primitivtypen kennt, das heißt alles ist ein Objekt. In C# kann man auch Objekte und Methoden mit Attributen auszeichnen, um sie mit Funktionalität anzureichern. Von Microsoft wird C# nur unter Windows unterstützt. Plattformunabhängigkeit ist bei C# also nur theoretischer Natur.
Die nächsten Versionen der Sprache Java
Vermutlich noch 2003 wird die erste Beta von Java 1.5 erscheinen. Sie wird voraussichtlich über folgende Neuerungen in der Sprache Java verfügen:
- Generische Typen (Generics)|Generizität
- Iteratoren via Syntax
- Typeinschränkung bei Rückgabetypen überschriebener Methoden
- Autoboxing / -unboxing
- Metadaten
- Statische Imports
Außerdem kann man davon ausgehen, dass sich Java im Laufe der Zeit zu einer der ersten aspektorientierten Programmiersprache wandeln wird.
Versionen
- JDK 1.0, 1996
- JDK 1.1, 1997
- J2SDK SE 1.2, 1998 (ab diesem Zeitpunkt spricht man von der Java 2 Plattform und vom Java 2 Platform Software Development Kit Standard Edition)
- J2SDK SE 1.3, 2000
- J2SDK SE 1.4, 2002
Siehe auch: Servlet -- Java Web Start -- Java Server Pages -- J2EE -- J2ME
Weblinks
- Java
- Benutzergruppen, Informationen
- Entwicklungsumgebungen
- Eclipse (Open source Entwicklungsumgebung für Java)
- NetBeans (Open source Entwicklungsumgebung für Java, selbst in Java geschrieben)
- JEdit (Open Source Text /Java Editor)
- JCreator (Freeware Entwicklungsumgebung für Java, englisch)
- Sun ONE Studio (Kommerzielle Entwicklungsumgebung für Java von Sun, basierend auf Netbeans)
- JBuilder (Kommerzielle Entwicklungsumgebung für Java von Borland)
- IntelliJ IDEA (Kommerzielle Entwicklungsumgebung für Java von IntelliJ)
- Bücher zum Online Lesen (und Herunterladen)
- Handbuch der Java-Programmierung (deutsch), von Guido Krüger
- Java2 (deutsch), von Friedrich Esser
- Java ist auch eine Insel (deutsch) von Christian Ullenboom
- Java 2 in 21 Tagen (detusch) von Laura Lemay
- Programmieren in Java (deutsch) von Boris Schäling
- The Java Tutorial (englisch) von Sun Microsystems
- Thinking in Java (englisch) von Bruce Eckel
- Verschiedenes
- www.javasoft.com Java-Abteilung von Sun Microsystems
- www.cetus-links.org Links on Objects & Components
- Java Linux Java Portierung für Linux vom Blackdown Team
- IBM developer kits Java Port von IBM
- Apple's Java developer connection