Home > Informatik > Einführung in die OOP > 1. Java und BlueJ > 1.3 Wir programmieren ein Bild

1.3 Wir programmieren ein Bild

1.3.1 Das Shapes-Projekt, Fortsetzung

Das BlueJ-Fenster mit dem Shapes-Projekt und einer zusätzlichen Klasse Zeichnung

⇒ Öffnen Sie das Shapes-Projekt und erzeugen Sie eine zusätzliche Klasse, die Sie Zeichnung nennen.

⇒ Doppelklicken Sie dann auf die neue Klasse und entfernen Sie alle Kommentare und sonstigen unnötigen Texte, bis nur noch das Grundgerüst der Java-Klasse übrig ist (siehe unten).

Der Minimal-Quelltext der Klasse Zeichnung

Dieser Quelltext besteht aus einem äußeren Rahmen, der von BlueJ grün dargestellt wird, und dem inneren Bereich, der hier gelb dargestellt ist. Der äußere Rahmen steht für die Klasse selbst, und in diesem Rahmen sind dann die verschiedenen Methoden enthalten.

Unser erstes Beispiel zeigt aber nur eine Methode, nämlich den sogenannten Konstruktor.

Konstruktor

Der Konstruktor ist eine spezielle Methode der Klasse, die immer dann ausgeführt wird, wenn mit Hilfe des new-Befehls ein neues Objekt der Klasse erzeugt wird.

Wenn Sie in BlueJ mit der Maus auf die Klasse Zeichnung gehen, können Sie mit der rechten Maustaste ein Kontextmenü aufrufen. Aus diesem Kontextmenü wählen Sie dann mit der linken Maustaste den Befehl new Zeichnung() aus. Dieser Befehl ruft den Konstruktor der Klasse Zeichnung auf und erzeugt ein Objekt dieser Klasse.

⇒ Ergänzen Sie diesen minimalen Quelltext nun durch zwei Instanzvariablen, wie im folgenden Screenshot gezeigt.

Der Minimal-Quelltext der Klasse Zeichnung mit zwei Instanzvariablen

⇒ Kompilieren Sie die Klasse und beobachten Sie dann das BlueJ-Fenster.

Der Pfeil, der nach dem Kompilieren von der neuen Klasse Zeichnung auf die Klasse Circle weist, bedeutet so viel wie: "Die Klasse Zeichnung besitzt jetzt Objekte der Klasse Circle".

Und genau das ist der Fall. Die Klasse Zeichnung hat zwei Objekte sonne und mond der Klasse Circle. Alle Objekte, die man jetzt aus der Klasse Zeichnung erstellt, besitzen ebenfalls diese beiden Objekte.

Exkurs: Beziehungen zwischen Objekten bzw. Klassen

Und damit haben wir auch schon die erste Beziehung zwischen Klassen kennengelernt. Im Unterricht der gymnasialen Oberstufe bezeichnet man diese Beziehungen meistens als HAT-Beziehungen. In der Fachliteratur spricht man dagegen von Kompositionen (Einzelheiten dazu finden Sie auf der Seite "Komposition" in der Abteilung "Begriffe und Konzepte" auf dieser Homepage).

Ein Objekt der Klasse Zeichnung HAT Objekte der Klasse Circle bzw. ist eine Komposition aus verschiedenen Objekten, u.a. der Klasse Circle.

⇒ Erzeugen Sie ein Objekt der Klasse Zeichnung und doppelklicken Sie auf dieses Objekt.

Der Objektinspektor zeigt die Instanzvariablen des Objektes zeichnung1 und ihre Werte

In dem Objektinspektor kann man alle Instanzvariablen des Objektes sehen - hier die Objekte sonne und mond - sowie die Werte, die in diesen Variablen gespeichert werden.

Im Augenblick haben wir die Objekte bzw. Instanzvariablen sonne und mond zwar deklariert - aber noch nicht mit new erzeugt. Daher zeigt der Objektinspektor hier noch den Wert null für die beiden Variablen an.

Ein kleines Experiment für Experten

Erstellen Sie folgende kleine Testklasse in dem Shapes-Projekt:

public class KleinerTest
{
    Circle sonne;
    
    public KleinerTest()
    {
       System.out.print("Wert von sonne nach der Deklaration: ");
       System.out.println(sonne);
       sonne = new Circle();
       System.out.print("Wert von sonne nach der Initialisierung: ");
       System.out.println(sonne);
    }
}

Schauen Sie sich nun die Konsolen-Ausgabe an:

Wert von sonne nach der Deklaration: null
Wert von sonne nach der Initialisierung: Circle@3720cd70

Diese kryptische Anzeige ist so zu lesen: Das Objekt sonne der Klasse Circle befindet sich an der Speicheradresse 3720cd70.

Machen wir nun weiter im Programm...

⇒ Initialisieren Sie die beiden Instanzvariablen sonne und mond, indem Sie die Befehle

sonne = new Circle();
mond  = new Circle()

in den noch leeren Konstruktor der Klasse Zeichnung schreiben.

⇒ Kompilieren Sie dann die Klasse Zeichnung und legen Sie wieder ein Objekt der Klasse an.

⇒ Rufen Sie dann den Objektinspektor auf und schauen Sie, ob sich etwas verändert hat.

Die Instanzvariablen sonne und mond haben jetzt Werte

Die Instanzvariablen sonne und mond sind jetzt mit Werten belegt. Allerdings handelt es sich bei diesen Werten nicht um Zahlen oder Zeichenketten, sondern um Speicheradressen. Daher werden diese Werte durch Pfeile dargestellt. Die Instanzvariablen sonne und mond verweisen auf Bereiche im Speicher, in denen die "eigentlichen" Objekte untergebracht sind. Man spricht hier auch von Referenzen: sonne und mond sind Referenzen. Wer das kleine Experiment für Experten (weiter oben) gemacht hat, kann sich jetzt gut vorstellen, was mit dem Begriff Referenz gemeint ist.

⇒ Doppelklicken Sie auf einen der beiden Pfeile bzw. auf eine der beiden Referenzen.

Das Objekt mond der Klasse Circle mit seinen vier Instanzvariablen

Wenn wir im Objektinspektor auf die Pfeile klicken, die die Speicheradressen von sonne und mond darstellen, dann öffnen sich zwei weitere Fenster des Objektinspektors. In diesen Fenstern sehen wir dann die tatsächlichen Objekte mit ihren jeweils vier Instanzvariablen

  • private int diameter
  • private int xPosition
  • private int yPosition
  • privat String color

Das Objekt mond hat einen Durchmesser von 30 Pixeln und befindet sich an der Position (20,60). Außerdem hat das Objekt die Farbe "blue".

Das Objekt sonne hat exakt die gleichen Werte - in allen vier Instanzvariablen.

Das heißt, beide Objekte - sonne und mond - befinden sich an der gleichen Position im Ausgabefenster, haben den gleichen Durchmesser und die gleiche Farbe. Daher kann man nur einen einzigen blauen Kreis sehen - in Wirklichkeit sind das zwei direkt übereinander liegende blaue Kreise.

1.3.2 Eigene Methoden erstellen

Wir wollen das Objekt sonne nun

a) größer machen

b) nach rechts bewegen

c) mit gelber Farbe darstellen.

Die drei entsprechenden Anweisungen müssen wir irgendwo in den Quelltext der Klasse Zeichnung einbauen. Aber wo am besten? Hier ein erster Versuch, der aber (wie viele erste Versuche) noch nicht so besonders schön ist - aber er funktioniert.

Einbau aller Befehle in den Konstruktor

Man sollte den Konstruktor einer Klasse möglichst kompakt gestalten. Am besten initialisiert der Konstruktor nur die Instanzvariablen. Alle anderen Operationen sollte man in eine oder mehrere neue Methoden auslagern. Und daher ist der erste Versuch noch nicht optimal. Wir betreiben jetzt ein Refactoring - ein Umbau des Quelltextes, wobei aber die Funktionalität des Quelltextes erhalten bleibt.

Einbau aller Befehle in den Konstruktor

Wir haben hier eine neue eigene Methode zeichne() erstellt, in die alle Befehle, die zum Erstellen der Zeichnung notwendig sind, eingefügt wurden.

Der Konstruktor initialisiert nur die beiden Instanzvariablen und ruft dann die Methode zeichne() auf.

Übung 1.3.2 #1

Ergänzen Sie den Quelltext jetzt um folgende Instanzvariablen: Square haus, Triangle dach.

Initialisieren Sie diese neuen Variablen im Konstruktor der Klasse Zeichnung.

Machen Sie die Objekte haus und dach in der Methode zeichne() sichtbar.

Verwenden Sie dann die Methoden dieser Objekte, um eine kleine Zeichnung zu erstellen, in der man ein Haus mit Dach sieht, außerdem einen kleinen blauen Mond und eine große gelbe Sonne.

Damit hätten Sie Ihr erstes kleines Java-Projekt abgeschlossen. Wenn Sie sehr früh damit fertig geworden sind, sollten Sie

  1. entweder herumgehen und den Leuten helfen, die noch Probleme haben oder
  2. ein komplexeres Bild mit noch mehr Graphik-Objekten erstellen oder
  3. die folgende Experten-Übung bearbeiten.

Experten-Übungen 1.3.2 #2

a) Sehen Sie sich den Quelltext der Klasse Square an und versuchen Sie zu verstehen, wie die Quadrate gezeichnet werden.

b) Erstellen Sie dann eine leere Klasse Rect und kopieren Sie den kompletten Quelltext vonSquare in diese neue Klasse hinein. Passen Sie die Bezeichner entsprechend an und ergänzen Sie die Klasse um die notwendigen Instanzvariablen. Modifizieren Sie die relevanten Methoden so, dass tatsächlich Rechtecke und nicht nur Quadrate gezeichnet werden können.

c) Überlegen Sie, wie Sie die Rechtecke mit einem Rahmen umgeben können, dessen Farbe und Strichstärke durch weitere Instanzvariablen und Methoden bestimmt werden können.

Bei dieser Übung 2 darf die neue Klasse nicht Rectangle heißen, da die Klasse Square auf eine bereits definierte Java-Klasse Rectangle zugreift. Sie müssen Ihre Rechteck-Klasse also anders benennen, da es sonst Probleme beim Kompilieren gibt.

Seitenanfang
Weiter mit Klassen, Objekten und Methoden ...