![]() |
8. OOP
|
||||||||||
Nun kommt eben das mit dem Objekt orientierten Programmieren (OOP): Eine zähe Sache für all die, welche sich beim sogenannten prozeduralen Programmieren auskennen und wohl ein Nasenwasser für all die, welche neu einsteigen. Es ist (nur?) eine Frage der Sichtweise beim Programmieren. Ganz am Anfang war hier der "Spaghetticode", der nach folgendem Prinzip verlief: "Mache das, dann mach das, dann prüfe eine Bedingung, wenn sie erfüllt ist, fahre weiter und sonst springe an eine andere Stelle im Programm (GOTO)." ... und nach etwa 10 GOTO Anweisungen in einem Programm war die Übersicht für den Programmierer verlorengegangen. Wehe, man sollte in so einem Programm einen Fehler finden! Also hat die Programmiergemeinde das prozedurale Programmieren erfunden, nach dem Prinzip: "Mache das, dann mache das nie oder ein- oder mehrmals, dann mach das, nur wenn eine Bedingung erfüllt ist. Und schliesslich mach noch das Ganze hier, von dem ich auch nicht weiss, was es ist ("black box")." Offenbar war auch dieser Ansatz nicht ganz das gelbe vom Ei, so dass eben die Idee vom OOP erfunden wurde. Hier auch das Prinzip: "In der Welt gibt es Objekte, die Eigenschaften haben und die oft auch etwas bewirken können. Die Objekte lassen sich hierarchisch klassifizieren, so dass der Aufwand für das Beschrieben nicht zu gross wird". Ob das wohl der Weisheit letzter Schluss ist? Sicher nicht, denn in der Zwischenzeit kamen weitere Ideen auf, wie zum Beispiel das Programmieren von wiederverwendbaren Komponenten (in Java sind das die Beans) oder die objektorientierte Beschreibung der Daten und nicht nur der Programme (Stichwort XML). Aber das Paradigma des OOP hat sich gehalten und ist aktueller denn je. Und insbesondere: In Java muss man OO programmieren, es geht gar nicht anders: Alles bis auf die primitiven Datentypen ist in Java ein Objekt! Sie haben längst mit Objekten gearbeitet und doch möchte ich mit etwas Neuem kommen, nämlich mit dem Thema Farben. Ich denke, dass Ihnen anschliessend verschiedene Lichter zum Bisherigen aufgehen werden. Damit die Sache handfest wird, sollen Sie sich parallel zur Lektüre ein kleines Applet erstellen:
Beim Übersetzen gibt es eine Fehlermeldung - dazu später mehr. Es macht ja auch keinen Sinn, dieses Programm laufen zu lassen, denn es würde nichts tun. Neu ist die Anweisung Color strandboden; Mit dieser haben Sie einen Variablennamen deklariert und gesagt, dass die Variable vom Typ Color ist. Analog haben Sie früher mal z.B. mit int i; eine Variable namens i vom Typ Integer (also ganze Zahl) deklariert. Neu ist hier, dass der Datentyp nicht einfach eine Zahl, sondern eine Klasse ist, nämlich die Klasse Color. Diese Klasse wurde von den Entwicklern von Java bereits programmiert. Später werden Sie aber auch eigene Klassen programmieren (übrigens: alle Ihre Programme sind ja auch Klassen!). Im SDK gibt es eine riesige Bibliothek von Klassen und Sie haben schon einige von ihnen verwendet. Wie sieht denn diese Klasse Color aus? Die Dokumentation zum SDK erklärt die ganze Klassenbibliothek des SDK. Es gibt für uns drei Möglichkeiten, die Dokumentation zu konsultieren:
|
|||||||||||
Sie kennen aus der Biologie auch eine Klassenhierarchie: Die "Mutter" aller Klassen ist hier die Klasse "Lebewesen". Sie hat zwei "Unter - Klassen", nämlich "Tiere" und "Pflanzen". Die Klasse "Tiere" wiederum hat Unterklassen wie "Säugetiere", etc. Und diese wiederum hat "Unter - Klassen" wie "Hängebauchschweine", etc.: Von "oben" nach "unten" geht es in der Klassenhierarchie immer von allgemein zu speziell. Ein Hängebauchschwein hat alle Eigenschaften eines Säugetiers und dieses wiederum hat alle Eigenschaften eines Tiers, etc. Die "unteren" Klassen in der Hierarchie "erben" alle Eigenschaften der Klassen, von denen sie "abstammen". Dass eine Klasse von einer andern abstammt, sagen wir in Java mit dem Schlüsselwort "extends" (= "erweitert"). Sie (bzw. JCreator!) haben am Anfang Ihres Applets geschrieben "public class Farben extends Applet": Ihre Klasse Farben stammt von der Klasse Applet ab und erbt (= "inherit") all deren Eigenschaften, so dass Farben eben auch ein Applet ist so wie ein Kanarienvogel auch ein Vogel ist. Diese Klassenhierarchie gibt die Möglichkeit, die Welt der Programmierung sehr effizient zu beschreiben, so wie die Klassifizierung in der Tier- und Pflanzenwelt den Biologinnen hilft, ihr Wissensgebiet sehr effizient zu bearbeiten. In Java stammt jede Klasse nur von einer Klasse ab, Mehrfachvererbung (= "multiple inheritance"), wie sie in der geschlechtlichen Fortpflanzung in der Biologie vorkommt gibt es hier also nicht. Ganz im Unterschied zu C++ übrigens. Die Erfinder von Java haben bemerkt, dass die Multiple-Inheritance zu sehr vielen Problemen führt und haben sie deshalb weggelassen. Aber keine Angst: Mit den sogenannten Interfaces ist dann etwas wie Mehrfachvererbung doch wieder möglich - aber dazu später. Zurück zu unserer Klasse Color. Sie beschreibt in Java, was Farben sind. Ich möchte nun aber konkret ein gibeligäub haben, also eine konkrete Farbe. Die konkrete Farbe ist eine Instanz der Klasse Color. Wenn in einem Biobuch über Hängebauchschweine geschrieben wird, dann wird über eine Klasse geschrieben, wenn es aber in Bern im Dählhölzli im Gehege ein solches Schwein hat, dann ist dies eine Instanz! Machen Sie also eine Instanz der Klasse Color:
Damit haben Sie eine Instanz der Klasse Color mit dem Namen strandboden erstellt. Mit dem Schlüsselwort new werden Instanzen von Klassen erzeugt. Rechts von new steht der sogenannte Konstruktor, den Sie für das Erzeugen der Instanz verwenden. In der Klasse Color sind verschiedene Konstruktoren vorgesehen: Schauen Sie sich nochmals die Dokumentation zur Klasse Color an, gehen Sie dort nach unten bis zum Abschnitt "Constructor summary": Sie sehen, dass es für Color insgesamt 7 Konstruktoren gibt. Welchen haben Sie wohl verwendet und was für eine Farbe hat er wohl für Sie gemacht? Hier noch einmal zur Veranschaulichung der Unterschied zwischen einer Klasse und einer Instanz (es geht hier nicht darum, die Details zu verstehen, sondern den prinzipiellen Unterschied zu erkennen):
|
![]() |
||||||||||
All das kann etwas verwirrlich sein, sie müssen es mehrmals durchdenken und wir wollen dies dann auch gemeinsam tun. Dazu drucken Sie bitte die nachfolgende Besprechung aus bevor Sie mit Klassen, Instanzen, Methoden, etc. weiterspielen:
Zwischenfrage:
Was bedeutet der Name strandboden? Es gibt nur je eine Vorder- und Hintergrundfarbe. Und doch können Sie in allen Farben zeichnen, denn die Klasse Graphics hat eine Methode namens setColor(), mit welcher Sie die Farbe, in welcher gezeichnet wird, beliebig oft ändern können. Sehen Sie sich dazu mein Applet an:
|
|
||||||||||
|
![]() |
||||||||||
|
![]() |
||||||||||