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:

  • Erstellen Sie ein neues JCreator Applet - Projekt namens Farben.

  • In der Methode paint() soll folgende Anweisung stehen:
    Color strandboden;

  • Setzen Sie die Zeile import java.awt.*;
    in Kommentar: // import java.awt.*;.

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:

  • Gehen Sie auf die Website von Sun: http://java.sun.com/j2se/1.4.2/docs/index.html. Sie sehen die Startseite zur Dokumentation des SDK, welche etwas verwirrlich ist. Wichtig für uns ist "API & Language". Klicken Sie hier und dann auf Java 2 Platform API Specification. Im Rahmen links unten sehen Sie "All Classes", also alle Klassen, welche im SDK sind - scrollen Sie hindurch - uff, da ist einiges. Es wird ein wichtiges Thema sein, eine Übersicht über all das zu gewinnen. Schauen sie sich aber jetzt die Dokumentation auf die zweite Art an:

  • Öffnen Sie den Windows - Explorer (Rechtsklick auf "Start"!) und suchen Sie den Ordner j2sdk1.4.2_05. In diesem Ordner befindet sich ja das SDK. Und im Unterordner docs befindet sich die Dokumentation - falls sie heruntergeladen wurde. Gehen Sie in den Unterordner und doppelklicken Sie index.html. Jetzt sind Sie wieder gleichweit wie auf der Website von Sun. Tip: Laden Sie die Dokumentation auch zu Hause herunter, weil es noch eine dritte Möglichkeit gibt:

  • In JCreator klicken Sie auf das Wort Color. Dann drücken Sie die Tastenkombination <Ctrl>+<F1>: Im Editorfenster wurde die lokal installierte Dokumentation des SDK geöffnet und zwar an der Stelle, an welcher die Klasse Color erklärt wird - genial! Über dem Namen Class Color steht java.awt. Die Klassen sind geordnet in Packages, wir würden sagen in Ordnern. Das wichtigste Package heisst java. Dieses hat wieder Unterpackages ("Unterordner") und eines heisst awt. Und in diesem befindet sich die Klasse Color.

  • Ist Ihnen aufgefallen, dass in der Zeile, die Sie in Kommentar gesetzt haben ebenfalls stand java.awt? Nehmen Sie den Kommentar für diese Zeile wieder weg (zu Ihrem Quelltext wechseln Sie mit dem Menü Window und suchen den Dateinamen fast zuunterst) und übersetzen Sie wieder. Jetzt sollte die Übersetzung fehlerfrei sein. Die Anweisung import sagt dem Compiler, wo er nach Klassen suchen soll. import java.awt.*; bedeutet suche im Package java, im Unterpackage awt und dort unter allen Klassen (der Stern bedeutet: alles). awt heisst "Abstract Window Toolkit" und bezeichnet die Klassen, welche für die Grafik gebraucht werden. Und Color befindet sich eben in diesem Package awt - Graphics übrigens auch.

  • Wechseln Sie wieder ins Fenster mit der Dokumentation zu Color. Unterhalb von Class Color sehen Sie, dass steht: java.Object und dann durch eine Linie verbunden: java.awt.Color. Klassen gehören zu einerKlassenhierarchie. Unsere Klasse Color befindet sich in der Hierarchie unterhalb der Klasse Object (Object seinerseits ist im package java.lang). Die Klassenhierarchie könnte viel komplexer sein, indem eine "Unter - Klasse" wieder weitere "Unter - Klassen" hat. Die "Mutter" aller Klassen in Java ist aber die Klasse Object, von ihr stammt alles andere ab.

 

 
 

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:

  • Ergänzen Sie Ihr Programm mit folgender Zeile nach der Deklaration von strandboden:

    strandboden = new Color(255,0,0);

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):



 Klasse

 Instanz
 Biologie 
Die Klasse Hängebauchschwein ist eine Tierart, die zu den Säugetieren gehört. Hängebauchschweine haben vier Beine, ihre Farbe ist dunkelgrau, sie können grunzen und sie stinken wie alle Schweine.

Das Hängebauchschwein Ellen im Tierpark:


Java
class HaengeBauchSchwein extends Saeuger {
  Haengebauchschwein(){
    super(dunkelgrau);
  }
  void stink(String level){
    System.out.println("Ich stinke "+level);
  }
}


HaengeBauchSchwein ellen;
ellen = new HaengeBauchSchwein();
ellen.stink("grässlich");  
 
 

 

  • In einer Klasse, die von Applet abstammt, sind die Methoden setForeground(); und setBackground(); definiert. Sie ermöglichen es, die Vorder- und Hintergrundfarbe für eine Zeichnung festzulegen. Mit setBackground(strandboden); legen Sie also die Hintergrundfarbe des Applet fest. Versuchen Sie's!

  • Ein roter Strandboden? Ändern Sie den Konstruktor von strandboden so ab, dass Sie einen grünen Rasen kriegen und schreiben Sie dann z.B. mit roter Schrift darauf "Hier liege ich an der Sonne!". Erstellen Sie dazu eine zweite Farbe, z.B. mit dem Namen ich und setzen Sie den Vordergrund auf diese Farbe. Denken Sie daran, dass es eine Methode drawString() gibt (Kapitel Grafik!). Mein Applet sieht dann wie rechts aus.

  • Es wird Abend auf dem Strandboden, die Farben werden dunkler - und das sollte auch unser Applet darstellen können. Dazu brauchen wir eine sogenannte Methode. Methoden sind Fähigkeiten einer Klasse. Die Klasse Color hat zum Beispiel die Fähigkeit, dunkler zu werden. Sie wurde von den Entwicklern von Java bereits in die Klasse Color einprogrammiert und heisst - logischerweise - darker(). Erzeugen Sie in Ihrem Applet eine dritte Farbe namens "abends", indem Sie den Konstruktor Color(0,0,0) verwenden (da wär's dann schon Nacht!). Nun ändern Sie die Instanz abends folgendermassen ab:

    abends = strandboden.darker();


Sie haben die Methode darker() der Instanz strandboden der Klasse Color verwendet. Diese liefert wieder eine Instanz der Klasse Color. Und diese ihrerseits setzen Sie Ihrer Instanz abends gleich. So ist nun abends eine dunklere Version von strandboden!

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?

Antwort
:strandboden ist der Name für eine Klasse / Instanz.

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:

public class Farben extends java.applet.Applet {
 public void paint(Graphics g) {
    Color strandboden,ich,abends;
    strandboden = new Color(0,255,0);
    ich = new Color(255,0,0);
    abends = strandboden.darker();
    setBackground(abends);
    setForeground(ich);
    g.drawString("Hier liege ich an der Sonne!", 100, 100);
    g.setColor(strandboden);
    
g.fillRect(100,120,100,20);
  }
}

  • Ändern Sie Ihr Applet gemäss meiner Vorlage ab: Unterhalb der Stelle, wo Sie liegen, sollte noch ein Flecken Sonne vom Tag her sichtbar sein!

  • Erfinden Sie weitere Methoden für die Klasse Hängebauchschwein: stinken(); grunzen(); ...haha!

 

 

 

 
  • Ändern Sie Ihr Applet so ab, dass es etwa so aussieht wie meines rechts - im Sonnenschein abdriften ins Nirvana! Denken Sie daran, dass wir ein Kapitel Loops hatten!

 



 
  • Turmbau zu Babel, dargestellt in Ihrem Applet: Die Turmbauer wählen die Farbe für jedes Stockwerk ihres Turmes absolut zufällig, so dass Ihr Applet dann etwa wie im Bild nebenan aussieht. Hinweis: Denken Sie daran, dass Sie im Kapitel Loops gewürfelt haben - auch da war der Zufall im Spiel. Achten sie auch darauf, dass die Zahlen, die Sie für die Farben verwenden, ganzzahlig (int) sind, Math.random() liefert Zahlen vom Typ float! Und noch etwas: Neben der Methode drawRect(), welche den Rand eines Rechtecks zeichnet gibt es auch die Methode fillRect(), welche das Rechteck mit der Zeichnungsfarbe ausfüllt - fillOval() etc. ebenso!