Einführung in Java am GZG

Einleitung in den Java-Kurs

Java am GZG

Ein Programm ist eine Folge von eindeutigen Anweisungen an den Computer. Der Erfolg des Computers beruht nicht zuletzt auf der Geschwindigkeit, mit der er diese Anweisungen ausführt. Er macht in einer Sekunde das, wozu Menschen, wenn sie wie Computer arbeiteten, Jahre benötigen würden. Ein Jahr hat etwa 31 Millionen Sekunden, eine CPU führt in 1 Sekunde rund Milliarde Operationen durch. Also ist eine Sekunde für einen Computer das, was für uns Menschen einige Jahrzehnte sind. Da ein Rechner aber nicht "mit denkt", muss ein Programmierer dem Computer eindeutig und klar vorschreiben, was zu tun ist. Ein heutiger Programmierer legt nicht mehr jeden einzelnen Schritt selbst fest, sondern er greift auf Unterprogramme zurück - in Java nennt man diese Unterprogramme Methoden; sie sind zusammen mit Variablen in Klassen gruppiert. Trotzdem erfordert das Programmieren oft ein Arbeiten auf einer hardwarenahen Abstraktionsebene, auch wenn es das Ziel der objektorientierten Programmierung ist, problemnaher zu abstrahieren (vgl. Bruce Eckel)

Wer Computer nutzt, ist erfolgreicher, wenn er weiß, wie ein Computer arbeitet und in welche Bausteine man Probleme untergliedern sollte, damit man sie mit dem Computer bearbeiten kann. Die Vorstellung von der Funktionsweise eines Computers und die Fähigkeit, Programme zu schreiben, entwickeln sich normalerweise gemeinsam. Eine Sache bedingt die andere. Wer entscheiden möchte, welche Dinge mit dem Computer gemacht werden sollen und welche besser mit einem anderen Werkzeug, sollte zumindest prinzipiell programmieren können - genauso wie ein Architekt, der Häuser plant, auch ein Wissen vom konkreten Hausbau besitzen sollte. Allerdings ist ein guter Handwerker nicht unbedingt ein guter Architekt. Auch dies lässt sich übertragen.

Man muss Geduld und Ausdauer aufbringen, wenn man programmieren lernt. Es gibt kein Programm zum Programmierenlernen. Der menschliche Geist funktioniert nicht wie ein Computer. Das Gehirn arbeitet parallel und organisiert sich selbst (wie man so schön umschreibend sagt - man weiß nicht, wie das Gehirn wirklich funktioniert), der Computer aber führt immer nur einen Schritt nach dem anderen aus, ohne selbst etwas dazu beizutragen. Erfahrungsgemäß lernt man Programmieren, wenn man 

  1. bestehende Programme liest und durchdenkt. Man liest ein Programm aber nicht wie einen Krimi. Man braucht dazu mehr Zeit, da Programme meist komplex und komprimiert sind. 
  2. selbst Programme schreibt. Lesen von Programmen allein genügt meist nicht, um die wesentlichen Ideen der Informatik nachvollziehen zu können. Man muss wiederholt die oft frustrierende Erfahrung machen, dass man nicht ohne Papier, ohne Korrektur, ohne Iteration programmieren kann. Man muss lernen, die (anfangs unverständlichen) Fehlermeldungen des Compilers zu verstehen. 

Auf lange Sicht ist das Programm gut, dessen Code man einige Wochen nach der Programmierung relativ schnell wieder versteht. Jeder gute Programmierer fügt deshalb seinem Programm sinnvolle Kommentare bei und gliedert es in verständliche und zusammengehörende Abschnitte. Ein Programm muss wartbar sein, nicht primär genial. Meist ist ein Programm, das viele Eingabefehler abfängt, günstiger als ein schnelles Programm, das nur bei korrekten Eingaben richtig läuft. Im Laufe der Zeit haben die Informatiker viele Methoden entwickelt, ein Problem zu gliedern, in bestimmte immer wieder auftretende Bausteine zu zerlegen. Und sie haben Vorgehensweisen entwickelt, die Programme überschaubar halten und damit wartbar.

Java ist keine schnell zu erlernende Sprache, auch wenn dies mitunter behauptet wird und es relativ einfach ist, kleine Progrämmchen und Applets zu erzeugen oder Vorlagen an eigene Wünsche anzupassen. Man kann leicht eine graphische Benutzerschnittstelle erzeugen, kann leicht Bild und Ton einbinden. Wenn man aber mehr machen möchte, als nur Spielereien, ermöglicht einem Java zusammen mit der Informatik (und Mathematik), sich in die Problemlösungsfindung mit Computern einzuarbeiten. Allerdings erfordert dies Zeit und Mühe. Java baut auf dem Wissen und den Erfahrungen der Informatik der letzten Jahrzehnte auf. In diesem Sinn ist Java eine moderne Sprache. Obwohl die Sprache Java erst 95 der Öffentlichkeit vorgestellt wurde, hat sie sich bereits heute (Sommer 2000) an fast allen Universitäten etabliert und es wird behauptet, 30% der Software würde mit Java entwickelt (vgl. [B880], S.80). Es gibt hierfür sicher viele Gründe. Einerseits ist Java günstig, um Anfänger in die heutige Computerstruktur und das Programmieren einzuführen, andererseits hat  Java Eigenschaften, die erfahrenen Programmieren ein zügiges und übersichtliches Vorgehen in komplexen Umgebungen ermöglichen (gedacht sei dabei an die Stichworte Windowsoberfläche, Internet, Datenbanken, aber auch an Waschmaschinenprozessoren), ohne früher oder später an Grenzen zu stoßen. Außerdem ist der prozedurale Sprachkern von Java mit der der Sprache C identisch - wer Java kann, lernt also auch C leicht, die gegenwärtig sicher wichtigste Sprache, die allerdings für Schüler weniger empfehlenswert ist, da C Anfängerfehler oft nicht abfängt, sondern eine Sprache ist, die es erfahrenen Programmieren ermöglicht, schnelle Programme zu schreiben. Durch diese Eigenschaften öffnet Java einem Neuling die Tür zur Informatik, wenn er den Computer nicht nur als Schreibmaschine oder Browser nutzen möchte. Er muss sich beim Erlernen von Java auf sinnvolle und praktische Weise mit den in der Informatik entwickelten Theorien auseinandersetzen - und er kann immer wieder ein neues Gebiet hinzunehmen, wenn er die Grundlagen verstanden und gelernt hat. Dadurch, dass Java für viele immer wieder auftretende Probleme Standardlösungen anbietet, die objektorientiert eingebunden werden, muss der Programmierer auch nicht immer jede Einzelheit eines Problems verstehen, sondern es genügt oft, die Probleme in als sinnvoll erkannte Standardbausteine zu zerlegen. Dies erweist sich besonders bei der graphischen Oberfläche, bei der Windowsprogrammierung als hilfreich.

Wer mit Java programmieren möchte, muss sich mit dem Konzept der Objektorientierung und den Grundstrukturen der algorithmischen Denkweise vertraut machen und die hierfür nötigen Vorgehensweisen einüben und lernen. Dies ist nur durch praktisches Üben möglich. In Java kann nur objektorientiert programmiert werden, was einen gewissen Oberhead bedeutet, der anfangs verwirrend erscheinen kann, wenn man nicht einfach akzeptiert, dass man als Neuling gewisse Dinge einfach "stumpfsinnig" akzeptieren und lernen muss. Darüber hinaus muss man die algorithmischen Strukturen und Vorgehensweisen (Stichworte: Variablen, Schleifen, Bedingungen, Arrays) lernen und sich mit ihnen vertraut machen. Java wird außerdem mit vielen fertigen "Hilfsroutinen" ausgeliefert, mit so genannten Klassen-Bibliotheken, die schon sehr früh Anwendung finden und deren Aufruf und grobe Funktionsweise deshalb auch gelernt werden müssen.

 

Die ältesten Schlüsselbegriffe der Programmierung sind Variable und Algorithmus. Eine Variable ist ein Bereich im Hauptspeicher, im "Memory", in dem Daten oder Informationen, d.h. Zahlen bzw. Buchstaben, abgespeichert werden. Ein Algorithmus ist eine Handlungsanweisung wie: "Multipliziere die beiden Zahlen, ziehe dann 7 ab, ..." oder: "Wenn der Schüler älter als 18 ist, dann ..." oder "wiederhole 500 mal folgendes Verfahren ...". Ein Programmierer erstellt grob gesagt Bedienungsanweisungen zum Abändern der Daten. Diese Bedienungsanweisungen müssen lückenlos sein und sollten alle Sonderfälle enthalten. 

Man hat schon früh festgestellt, dass immer wieder dieselben komplexeren Programmteile benötigt werden, wie z.B.: Quadratische Gleichungen lösen, Nullstellen bestimmen, Zeichenketten ordnen, neue Daten in bestehende Bestände so einordnen, dass man sie später schnell wieder findet, usw. Zur Strukturierung dieser Probleme dachten sich die Informatiker das aus, was man Prozedur, Funktion oder Methode nennt (der letzten Begriff wird in Java verwendet). Der Computer ist mit mathematischen Verfahren und Denkweisen groß geworden. Und diese spielen auch heute noch eine zentrale Rolle - auch wenn die mathematischen Verfahren nicht nur auf Zahlen, sondern auf Zeichenketten (Strings), auf Buchstaben, Worte, Texte und Bilder angewendet werden.

Komplexere Programme werden erfahrungsgemäß schnell unübersichtlich. Dies liegt in der Natur der Sache, da selbst relativ "einfache" Vorgänge lange Programme erfordern (auch wenn der zu schreibende Code in Java anfangs nicht besonders lang ist, man verwendet ja bereits fertige Bibliotheksmethoden). Z.B. besteht das Office-Programm Word aus 400 000 Programmzeilen. Das ausgedruckte Programm würde damit etwa 40 Taschenbücher umfassen (siehe [B845], S.29). Dabei ist sogar weniger die Länge des Programms, als vielmehr seine Komplexität das Hauptproblem. Programmierer müssen deshalb die Probleme in überschaubare Bausteine zerlegen, deren weitere Programmierung nicht von allen Programmierern verstanden werden muss. Ein Systemanalytiker, der die Programmierung plant, muss nicht alle Einzelheiten verstehen. Ein Architekt kenne auch nicht alle Vorgänge, die zum Bau eines großen Hauses nötig sind. Man hat deshalb bereits sehr früh versucht, die im Computer zu lösenden Probleme in Bausteine zu zerlegen, die man möglichst eins zu eins im Computer bearbeiten kann, um damit auf die menschliche Erfahrung zurückgreifen zu können. Die theoretischen Informatiker, die dieses Vorgehen erleichtern wollten, prägten hierfür den Begriff Objektorientierung. Sie klassifizierten die zu lösenden Probleme wie z.B. die Biologen die Tiere und die Pflanzen. Sie haben einen Stammbaum von zu bearbeitenden Problemen angelegt, so wie die Biologen einen Stammbaum der Tiere und Pflanzen entwickelt haben. Sie entwickelten Vorgehensweisen, die dem Programmierer dabei helfen sollen, die zu programmierenden Aufgaben selbst zu klassifizieren. Daneben sollen diese Strukturen auch die Wartung von komplexen Programmen vereinfachen. Eine Verbesserung eines Problems soll schließlich nicht dazu führen, dass an anderer Stelle Fehler auftreten. Das Stichwort dabei ist Information Hiding - frei interpretiert: Ein Programmierer darf sich nicht um zu viele Einzelheiten kümmern. Bei ähnlichen Problemen sollten die Programmierer auch alle bereits früher programmierten sinnvollen Methoden übernehmen können - und möglichst nur die nötigen Änderungen durchführen müssen, ohne die alten Programme Schritt für Schritt verstehen zu müssen oder gar Änderungen vornehmen zu müssen, die die früheren Programme beeinflussen könnten. Das Stichwort hierfür ist Vererbung..

Natürlich machen alle diese Verfahren den Einstieg in die Informatik für den Anfänger nicht unbedingt leichter. Eine bekannte Hürde beim Programmieren mit modernen Sprachen ist die Anforderung an heutige Programme, eine eigene Fensterumgebung zu besitzen und auf Mausaktionen zu reagieren (Stichworte: Ereignisse, Event Handling und Ereignisbearbeitung). In den 60er Jahren war es üblich, zu Beginn des Programms Daten einzulesen, dann die Algorithmen durchzuführen und zuletzt die Ergebnisse auszudrucken. Im Prinzip ist dies das Vorgehen von sogenannten DOS-Programmen, die keine Oberfläche besitzen. Dieses Vorgehen ist für Anfänger meist leichter zu verstehen und zu durchschauen, da man sich dabei auf die eigentliche Algorithmik konzentrieren kann. Dies ist ein Grund, warum viele Lehrer noch - sicher nicht zu Unrecht! - Pascal oder Delphi für Anfänger verwenden. Andererseits aber bietet Java inzwischen die Möglichkeit, die Schüler direkt an die moderne Programmierung heranzuführen, da Java viele gut durchdachte Bausteine (in Form von Bibliotheksmethoden) bereitstellt, die nur einen groben Überblick über das sogenannte Event Handling erfordern - den aber schon! Im Gegensatz zu Delphi muss bei Java also ein gewissen Verständnis dafür erarbeitet werden. Moderne Windows-Programme sind ja nicht nur Algorithmik und bunte blinkende Icons oder Buttons. Dadurch wird die Funktionsweise moderner Programme durch den Umgang mit Java vom Prinzip her verständlich - dies ist zumindest die Hoffnung des Lehrers.

Das Ziel diese Einführung ist es, Schüler anhand von Beispielen und Aufgaben in die Anfänge der Programmierung einzuführen und sie dabei mit den wesentlichen theoretischen Grundlagen der Informatik vertraut zu machen. Wenn man mit etwas vertraut ist, kann man es später leichter lernen.

Diese Webseiten waren ursprünglich kein Java-Kurs, sondern hier wurden die im Unterricht erarbeiteten Applets zur Wiederholung für die Schüler des GZG Grundkurses Informatik bereit gestellt. Dies soll im Kern auch so bleiben (siehe Vorwort)

 

Bevor man das erste Java-Programm schreiben kann, muss man

  1. den Java-Compiler installieren
  2. eine Entwicklungsumgebung (IDE = Integrated Development Environment) wählen und installieren
  3. sich mit der gewählten Entwicklungsumgebung und dem Java-Compiler und dessen Fehlermeldungen vertraut machen.

Am GZG wird gegenwärtig (Sommer 2003) Java 1.4.1 und JCreator 2.5 LE als IDE verwendet. Die hier vorliegenden Unterlagen sind aber großenteils im Sommer 1999 mit  Java 1.2.2 und Kawa 3.5 erstellt worden und werden im Laufe des Schuljahres 03/04 angepasst. Kawa ist heute leider nicht mehr zu bekommen, die Entwicklung wurde eingestellt. JCreator scheint ein sinnvoller Ersatz zu sein, da es wie Kawa keine komplexe Oberfläche darstellt, sondern die eigentlichen Programmieraufgaben noch gut erkennen lässt.

Die benötigten Programmier-Tools sind auf den Rechnern der Schule installiert, so dass die beiden ersten Schritte oben im Unterricht übersprungen werden können. Wer zu Hause allerdings eine eigene Programmierumgebung aufbauen möchte - was sehr zu empfehlen ist, dies ist einer der zentralen Punkte, die für die Wahl von Java mit JCreator statt Delphi sprechen -, kann sich am GZG eine Java-CD ausleihen, die die Installationsprogramme enthält oder er kann die neusten Versionen der Programme aus dem Netz laden und auf seinem PC problemlos installieren (siehe hier). Der Java-Compiler von Sun ist frei zugänglich, ebenso JCreator LE.. Die CD enthält auch die neuste Version 1.4.2 von Java neben Kawa auch andere IDEs wie z.B. JBuilder. Informationen zu den Installationen von Java und von JCreator 2.5 LE finden sich ebenfalls auf dieser Homepage zu Java am GZG.


Zum Inhaltsverzeichnis: 
Einführung in Java am GZG

vorwärts>>

(Verantwortlich für die Seite: W. Seyboldt/ Stand: 11. November 2006)