Programmieren in Java: Einführung
Dieses Buch ist unter einer Creative Commons-Lizenz lizensiert.
Die Programmiersprache Java wurde Mitte der 90er Jahre von der Firma Sun Microsystems erfunden, die auch heute noch alle Rechte an dieser Programmiersprache hält. Java gehört somit zu den neueren Programmiersprachen, die es gibt. Trotz ihres geringen Alters konnte Java bisher viele Software-Entwickler begeistern und erfreut sich unter Programmierern großer Beliebtheit.
Java wird gemeinhin als Internet-Programmiersprache bezeichnet. Man bezieht sich damit auf die hohe Portabilität von Java. Während Anwendungen in C, C++ oder Visual Basic lediglich unter einem ganz bestimmten Betriebssystem mit einem ganz bestimmten Prozessor laufen, laufen Java-Programme unter jedem Betriebssystem und auf jedem Prozessor. Da vor allem im Internet die unterschiedlichsten Computer-Systeme zusammenhängen, ist Java ideal, um Anwendungen zu entwickeln, die tatsächlich auf jedem Computer-System laufen können.
Die hohe Portabilität ist wohl der entscheidenste Grund, warum sich Java innerhalb weniger Jahre sehr stark verbreiten konnte und heute eine sehr große Entwicklergemeinde hinter sich hat. Neben der Portabilität ist für die Verbreitung der Sprache auch die Ähnlichkeit zur Programmiersprache C++ entscheidend gewesen. Sehr viele C++-Entwickler konnten und können sehr schnell Anwendungen in Java erstellen, ohne sich großartig viel mit der neuen Programmiersprache befassen zu müssen. Java setzt letztendlich ähnliche Konzepte wie C++ um und verwendet hierbei auch noch dieselben Schlüsselwörter. Lediglich kompliziertere Bestandteile von C++ wurden nach Java nicht übernommen. Das bedeutet, Java kann einfacher als C++ erlernt werden.
Anwendungen, die über das Internet verteilt werden, besitzen grundsätzlich ein Sicherheitsproblem. Denn es ist nie sicher, ob man der Quelle vertrauen kann, von der man ein Computer-Programm erhalten hat. Im Zusammenhang mit regelmäßigen Horrormeldungen wie zum Beispiel dem I-Love-You-Virus darf man nicht blindlings darauf vertrauen, dass Anwendungen aus dem Internet sicher sind.
Obwohl Java-Anwendungen also größtmögliche Portabilität besitzen, wird sie kein Anwender ausführen, wenn er nicht sicher sein kann, dass die Anwendung keinen Schaden auf seinem Computer-System anrichtet. In das Java-System ist daher ein Security-Manager integriert. Ein Java-Programm läuft immer unter Beobachtung des Security-Managers ab. Dieser Manager legt fest, was das Java-Programm darf und was nicht. So kann der Security-Manager dem Java-Programm beispielsweise verbieten, auf die Festplatte des Computers zuzugreifen.
Die Verteilung von Java-Anwendungen findet großenteils über das WWW statt. Java-Applets sind Java-Anwendungen, die in Webseiten eingebunden werden. Surft nun der Anwender auf eine entsprechende Webseite, wird ihm zusätzlich zur Webseite das Java-Applet heruntergeladen und bei ihm auf seinem Computer ausgeführt. Für die Ausführung des Java-Applets ist hierbei wie für das Herunterladen der Webseite der Browser verantwortlich. Der Security-Manager im Browser ist sehr restriktiv eingestellt, um unbekannten Programmen nicht den Zugriff auf sicherheitsgefährdende Bereiche des Computer-Systems zu ermöglichen. Man spricht davon, dass Java-Applets in einer Sandbox ablaufen. In der Sandbox können sie machen, was sie wollen. Jeder Versuch, aus der Sandbox heraus auf andere Bereiche des Computers zuzugreifen, wird abgeblockt.
Die Portabilität, relativ leichte Erlernbarkeit und Sicherheit sind die entscheidenden Vorteile von Java und der Grund, weshalb sich Java so schnell verbreiten konnte.
Java ist nicht einfach nur der Name einer Programmiersprache. Um Ziele wie hohe Portabilität und Sicherheit zu erreichen, muss Java mehr als eine Programmiersprache sein. Java ist eigentlich ein System aus Programmiersprache, Virtual Machine und Bibliothek.
Die Programmiersprache Java definiert wie bei Programmiersprachen üblich Syntax und Semantik. Das heißt, Java legt eine Reihe von Schlüsselwörtern fest, die in dieser Programmiersprache verwendet werden können, und definiert für jedes dieser Schlüsselwörter eine Bedeutung. Die Schlüsselwörter in Java ähneln sehr denen in C++, so dass C++-Programmierer grundsätzlich sehr schnell Java lernen können. Für den Programmierneuling ist es selbstverständlich von entscheidender Bedeutung, die Syntax und Semantik von Java eingehend zu erlernen.
Man unterscheidet bei einer Programmiersprache wie Java mehrere Bestandteile: Variablen werden benötigt, um Informationen in Programmen zu speichern. Operatoren ermöglichen die Verarbeitung von Informationen, die zum Beispiel in Variablen gespeichert sind. Während mit Variablen und Operatoren bereits linear ablaufende Programme erstellt werden können, können durch Kontrollstrukturen Bedingungen überprüft werden und davon abhängig unterschiedliche Verarbeitungen vorgenommen werden. Das Zusammenstellen von Variablen, Operatoren und Kontrollstrukturen in Funktionen ermöglicht eine bessere Strukturierung von Quellcode. Durch das Zusammenfassen von Funktionen und Variablen zu Klassen steigt man in die objektorientierte Programmierung ein, die in Java zwingend vorgeschrieben ist.
Neben der Programmiersprache selber stellt die Virtual Machine, auch Java-VM genannt, den entscheidenden Baustein dar, der die hohe Portabilität von Java erst ermöglicht. Wie die Java-VM funktioniert und warum sie überhaupt benötigt wird, wird nachfolgend im Kapitel beschrieben.
Mit der Bibliothek wird Java komplett. Man versteht unter der Bibliothek eine große Ansammlung an Klassen - eine Klassenhierarchie - auf die der Java-Programmierer zugreifen kann. In dieser Klassenhierarchie werden eine Menge an Hilfsmitteln zur Verfügung gestellt, mit denen der Java-Programmierer seine Anwendungen entwickeln kann. Nachdem diese Klassenhierarchie ein fester Bestandteil von Java ist, trägt sie ebenfalls zu hoher Portabilität bei. Denn der Entwickler kann sich sicher sein, wenn er eine der Klassen in seinem Projekt verwendet, dass die Klasse auch bei anderen Anwendern zur Verfügung steht und sein Programm auch auf fremden Computern funktioniert.
Um ein Java-Programm zu erstellen, wird der Quellcode in einer einfachen Text-Datei gespeichert. Damit das Java-Programm auch ausgeführt werden kann, muss der Quellcode in Maschinencode umgewandelt werden. Denn während der Programmierer Quellcode versteht, versteht die Maschine nur Maschinencode.
Die Umwandlung von Quellcode in Maschinencode führt ein Compiler durch. Der Compiler schaut sich die Textdatei mit dem Quellcode an und übersetzt den Quellcode Schritt für Schritt in Maschinencode.
Dieser Maschinencode, den der Compiler erstellt, ist jedoch etwas merkwürdig: Denn der Computer, also die Maschine selber kann diesen Maschinencode normalerweise immer noch nicht verstehen und daher das Programm auch nicht ausführen. Auf heutigen Computer-Systemen beispielsweise mit einem Pentium-Chip müsste Quellcode in Maschinencode für den Pentium-Chip übersetzt werden, damit auch der Prozessor den Maschinencode ausführen kann. Der Java-Compiler erstellt aber keinen Maschinencode für den Pentium-Chip und auch nicht für irgendeinen anderen real existierenden Prozessor. Der Java-Compiler erstellt Maschinencode für eine virtuelle Maschine, für die Java-VM.
Wie der Name bereits sagt ist diese Maschine virtuell. Es gibt keinen Prozessor, der Maschinencode ausführen kann, den der Java-Compiler erzeugt. Wie kann nun der Maschinencode gelesen und das Programm ausgeführt werden?
Um den Maschinencode lesen zu können, benötigt man eine Software, die den Java-Prozessor nachahmt. Diese virtuelle Maschine tut also nun so, als wäre sie ein echter Java-Prozessor, der den Maschinencode ausführen kann. In Wahrheit interpretiert die Java-VM einfach den Maschinencode und kümmert sich darum, dass das, was sie im Maschinencode liest, auch ausgeführt wird. Das heißt konkret: Der Maschinencode wird nicht direkt durch die Hardware (also durch den Prozessor) ausgeführt, sondern der Maschinencode wird durch Software, nämlich durch die Java-VM interpretiert.
Code, der nicht von einem Prozessor ausgeführt wird, sondern von einer virtuellen Maschine, wird genaugenommen nicht als Maschinencode bezeichnet, sondern als Bytecode. So kann begrifflich zwischen Code unterschieden werden, der von echten Prozessoren und der von virtuellen Maschinen ausgeführt wird.
Jetzt sollte auch klar sein, warum Java-Programme im Gegensatz zu Programmen in anderen Programmiersprachen auf jedem Betriebssystem und auf jedem Prozessortyp laufen: Das Betriebssystem und der Prozessor haben mit der Ausführung des Java-Programms gar nichts zu tun. Es kommt nur darauf an, dass es eine Software auf dem betreffenden Betriebssystem gibt, die den Bytecode interpretieren kann.
Diverse Software-Hersteller bieten im Internet Development Kits zum Download an. Das wichtigste stammt von Sun Microsystems, da diese Firma der Rechteinhaber und verantwortliche Entwickler von Java ist. Im SDK von Sun, das online kostenlos zum Download angeboten wird, sind Compiler, virtuelle Maschine sowie die Java-Bibliothek inklusive Dokumentation enthalten.
Neben der Java-Standardbibliothek bieten Hersteller zum Teil weitere Klassenhierarchien an, die zusätzlich zu den Standardklassen in Java-Projekten verwendet werden können. Diese zusätzlichen Klassenhierarchien bieten beispielsweise Funktionen, auf die Sie in Ihrem Projekt zugreifen möchten, die jedoch leider in der Standardbibliothek nicht enthalten sind.
Eine sehr interessante Klassenhierarchie war zum Beispiel die WFC von Microsoft. Mit der WFC, abgekürzt für Windows Foundation Classes, konnten Windows-Programme entwickelt werden, bei denen ein Anwender nie auf die Idee gekommen wäre, dass sie in Java entwickelt waren, weil sie dieselben grafischen Elemente enthielten wie jede andere in C++- oder Visual Basic-entwickelte Windows-Anwendung auch. Es war sogar möglich, mit dieser Klassenhierarchie native Anwendungen für Windows zu entwickeln - also Anwendungen, die tatsächlich aus Maschinencode für einen real existierenden Prozessor bestanden und keine Java-VM mehr benötigten. Mit den WFC ermöglichte Microsoft Java-Programmierern, 100%ig echte Windows-Anwendungen zu erstellen.
Diese Klassenhierarchie war ein Grund für einen langjährigen Rechtsstreit zwischen Sun und Microsoft. Während Sun Microsoft vorwarf, die Portabilität von Java zu zerstören und Java auf die Windows-Plattformen hin auszurichten, verteidigte sich Microsoft damit, dass Java-Entwickler eben auch mit Java ganz normale Windows-Programme erstellen wollten und dies mit dieser speziellen Klassenhierarchie auch konnten. Nachdem Sun den Rechtsstreit gewonnen hatte, stellte Microsoft die Unterstützung für Java ein, so dass die WFC-Bibliothek heute auch nicht mehr existiert.
Sie werden nun Ihr erstes Java-Programm entwickeln und dabei den kompletten Ablauf vom Schreiben des Quellcodes über die Kompilierung bis hin zur Ausführung durchlaufen. Geben Sie folgenden Quellcode in einen Text-Editor ein und speichern Sie die Datei dann als MyApplet.java.
import java.applet.*;
import java.awt.*;
public class MyApplet extends Applet
{
private Label MyLabel = new Label();
public void init()
{
MyLabel.setText("Hallo, Welt!");
add(MyLabel);
}
}
Obiges Beispielprogramm ist ein Applet. Ein Applet ist eine Java-Anwendung, die innerhalb eines Browsers läuft. Während ein Applet also nur im Browser läuft, können mit Java auch Anwendungen erstellt werden, die ohne Browser laufen (nicht aber ohne virtuelle Maschine). Man spricht dann nicht von einem Applet, sondern von einer gewöhnlichen Application, also Anwendung. Applet ist eigentlich ein Code-Schnippsel, das sozusagen in den Browser eingefügt wird. Im zweiten Kapitel wird Ihnen ein Beispiel-Code für eine Application vorgestellt, die ohne Browser läuft.
Sie haben nun Ihren Quellcode erstellt und ihn in einer Datei namens MyApplet.java gespeichert. Achten Sie darauf, dass die Datei auch tatsächlich so heißt. Der Dateiname muß mit dem Namen der Klasse übereinstimmen, den Sie im Quellcode angegeben haben. Die Endung der Datei sollte bei Java-Quellcodes java lauten.
Nun geht es darum, den Quellcode zu übersetzen. Sie benötigen hierfür einen Compiler, den Sie wie beschrieben beispielsweise auf der Website von Sun herunterladen können. Der Compiler für Java-Programme heißt bei Sun javac. Um nun Ihren Quellcode mit dem Compiler von Sun zu kompilieren, geben Sie in der MS-DOS-Eingabebox folgendes ein: javac MyApplet.java.
Gegebenfalls müssen Sie Pfad-Angaben vornehmen, damit der Compiler die Datei finden kann.
Hat javac den Quellcode kompiliert, befindet sich im gleichen Verzeichnis wie die java-Datei nun eine Datei namens MyApplet.class. In dieser Datei befindet sich der Maschinencode für die virtuelle Maschine.
Nachdem es sich um ein Java-Applet handelt, das innerhalb des Browsers ausgeführt werden muss, müssen wir es irgendwie in den Browser laden. Das Java-Applet direkt in den Browser laden funktioniert nicht. Es muss über eine Webseite eingebunden werden. Geben Sie hierzu folgenden HTML-Code in einen Text-Editor ein und speichern Sie die Datei unter MyApplet.htm im gleichen Verzeichnis wie Ihren Java-Quellcode und die class-Datei. Wichtig ist vor allem die Dateiendung htm.
<html>
<head>
<title>Programmieren in Java: Einführung</title>
</head>
<body>
<applet code="MyApplet.class" width="200" height="30">
</applet>
</body>
</html>
Laden Sie nun die HTML-Seite in Ihren Browser. Unterstützt Ihr Browser Java und ist Java aktiviert, sollten Sie im Browser ein Java-Applet sehen, das die Meldung Hallo, Welt! ausgibt.
Die Einbindung von Java-Applets in Webseiten findet über den HTML-Tag <applet> statt. Hinter dem Attribut code wird der Name der Datei angegeben, in der sich der Maschinencode befindet. Die Attribute width und height definieren, wieviel Platz das Java-Applet in der Webseite einnehmen soll. Die Maßeinheit ist Pixel.
Ohne komfortable Entwicklungsumgebung bleibt dem Java-Entwickler nichts anderes übrig, als Quellcodes jeweils mit Hilfe der freiverfügbaren Konsolenanwendungen zu kompilieren. Um sich die Arbeit unter Windows ein wenig einfacher zu machen, legen Sie folgende Datei an und speichern Sie sie als compile.bat in dem Verzeichnis, in dem sich Ihr Quellcode befindet.
@echo off echo Java-Kompilierung gestartet ... "C:\Programme\Java\jdk1.6.0\bin\javac" *.java cls
Wann immer Sie nun Ihren Quellcode kompilieren möchten, machen Sie in Windows einfach einen Doppelklick auf diese Datei. Es handelt sich hierbei um eine Batch-Datei, mit denen ursprünglich unter MS-DOS und heute auch unter Windows Aufgaben automatisiert werden können. In diesem Fall wird der Compiler von Sun, nämlich das Programm javac im angegebenen Verzeichnis gestartet und auf alle Dateien angewandt, die auf die Endung java lauten. Wenn Sie die Batch-Datei auf Ihrem System verwenden wollen, müssen Sie gegebenenfalls den Pfad zu javac anpassen.
Wenn Sie die letzte Zeile aus der Batch-Datei entfernen und cls löschen, bleibt das Fenster, das bei Doppelklick auf die Batch-Datei erscheint, offen und schließt sich nicht automatisch. Das ist besonders dann wichtig, wenn der Compiler Fehler meldet und sie im Fenster ausgibt. Diese Fehlermeldungen helfen Ihnen, Fehler in Ihrem Code zu finden. Daher sollte das Fenster in diesem Fall nicht automatisch geschlossen werden.
Versionen kennt jeder Anwender von Programmen her: Nach Microsoft Office 2002 folgte Microsoft Office 2003, dann Microsoft Office 2007. Nach dem Microsoft Internet Explorer 6 folgte die Version 7, dann die Version 8. Während bei Programmiersprachen normalerweise keine Versionsnummern existieren, weil die Entwicklung von Programmiersprachen nicht so schnell voranschreitet wie die Entwicklung von Anwendungsprogrammen, ist dies bei Java anders. Java liegt in verschiedenen Versionen vor. Die Versionen unterscheiden sich jedoch nicht darin, dass die Programmiersprache auf einmal geändert wurde, sondern dass sich die Klassenhierarchie - die Bibliothek, die zu Java fest dazugehört - weiterentwickelt. Obwohl sich also die Programmiersprache in Syntax und Semantik fast nie geändert hat, spricht man dennoch von verschiedenen Java-Versionen, weil die Klassenhierarchie einfach ein unzertrennlicher Bestandteil von Java ist.
Wenn man Anwendungen für Webseiten entwickelt, muss man wissen, was für Java-Versionen von den verschiedenen Browsern unterstützt werden. Wenn Sie Ihr Programm in einer neueren Version von Java erstellen, weil Sie eben auf eine neuere Klassenhierarchie zugreifen wollen, dann kann es sein, dass Ihr Java-Programm trotz hochgelobter Portabilität auf nur wenigen Systemen läuft, weil die von Ihnen verwendete Java-Version einfach noch nicht so weit verbreitet ist.
Die allererste Version von Java war Java 1.0. Java 1.0 wird seit dem Microsoft Internet Explorer 4 und seit dem Netscape Navigator 4 unterstützt. Nachdem sowohl Java 1.0 als auch diese Browser-Versionen mehr als zehn Jahre alt sind, programmiert heutzutage niemand mehr in Java 1.0.
Recht schnell nach Java 1.0 wurde Java 1.1 veröffentlicht. Java 1.1 wurde mehrmals verbessert und lag in den Versionen 1.1.1 bis 1.1.8 vor. Diese Versionen wurden ebenfalls vom Microsoft Internet Explorer 4 und Netscape Navigator 4 unterstützt.
Mit Java 1.2 gab es einen Bruch: Diese Version war die erste, die nicht mehr vom Microsoft Internet Explorer von Haus aus unterstützt wurde. Während andere Browser wie der Netscape Navigator Unterstützung für Java 1.2 boten, wurde der Internet Explorer viele Jahre nur mit Java 1.1 ausgeliefert. Grund war der bereits erwähnte Rechtsstreit zwischen Sun und Microsoft. Microsoft war es gestattet, Java 1.1 zu unterstützen, aber nicht mehr weiterzuentwickeln.
Während sich Java von Version 1.2 über 1.3 zu 1.4 weiterentwickelte, blieb der Internet Explorer bei 1.1 stehen. Aufgrund der großen Verbreitung des Internet Explorers bedeutete das in der Praxis, dass Java-Applets fürs WWW mit Java 1.1 entwickelt werden musten, obwohl neuere und stark verbesserte Java-Versionen zur Verfügung standen. Es bestand die Möglichkeit, ein Add-On für den Internet Explorer zu installieren, um auch in diesem Browser Java-Applets ausführen zu können, die mit einer neueren Version von Java entwickelt worden waren. Da dieses Add-On jedoch nicht von Haus aus installiert war, war es unter Internet Explorer-Anwendern nicht sehr verbreitet.
Die aktuelle Java-Version ist 1.6. Java wird zwar immer noch nicht von Microsoft unterstützt. Das Verhältnis zu Java hat sich aber entspannt. So hat Microsoft die Unterstützung für Java 1.1 entfernt, die in früheren Versionen des Browsers standardmäßig vorhanden war, und empfiehlt Anwendern nun, das Add-On von Sun zu installieren. Anwender müssen immer noch selbst tätig werden, um den Internet Explorer um eine Java-Unterstützung zu erweitern. Für Entwickler stellt sich aber nur mehr die Frage, ob Java in einem Browser unterstützt wird oder nicht. Die Frage, welche Java-Version denn dann genau unterstützt wird und ob man eventuell auf eine ältere Java-Version zurückgreifen muss, spielt im Allgemeinen keine große Rolle mehr. Insofern kann man heute als Java-Entwickler aus dem Vollen schöpfen und von den neusten Entwicklungen in Java profitieren, ohne sich Gedanken machen zu müssen, ob die in Java entwickelte Software wirklich in allen Browsern läuft.
Copyright © 2001-2010 Boris Schäling