Objekt-Orientierung
Die ersten objektorientierten Sprachen wurden ab 1967 entwickelt (Simula, Smalltalk). Die
Grundidee besteht darin, Objekte der realen Welt abzubilden.
Java-Programme bestehen aus Klassen.
Eine Klasse beschreibt, welche Attribute (=Merkmale) die aus ihnen erzeugte Objekte besitzen und
über welche Methoden (=Verhalten) die Objekte verfügen. Eine Klasse ist als Bauplan für Objekte
zu verstehen.
Beispiel
Das Applet Ball02.class:
Welche Eigenschaften besitzt das Objekt Ball?
Es besitzt einen Durchmesser: int durchmesser;
Es besitzt Koordinaten für den Mittelpunkt: int xK, yK;
Weitere Attribute (Datenfelder) sind Durchmesser und Farbe, gespeichert
durchVariablen:
private int durchmesser;
private int x1, y1;
private Color farbe =Color.black;
Der Ball besitzt Methoden, die eine Funktionalität beschreiben:
Der Ball kann angezeigt werden: anzeigen( ) { .... }
Der Ball kann z.B. seine Größe verändern: groesseAendern(int veraenderung) { .... }
usw.
Grundkonzepte der Objekt-Orientierung
– Klassen beschreiben Mengen von Objekten. Objekte werden mit Hilfe eines
Konstruktors erzeugt (gebaut).
– Objekte besitzen Attribute (Variablen) und Methoden.
Methoden implementieren das Verhalten des Objekts.
– In objektorientierten Programmiersprachen sind die Attribute und Methoden an das
Objekte gebunden (gekapselt).
OOP in Klasse 11 © A. Wagner, Seite 8
Beispiele
Klasse
Strecke
mit den Endpunkten
P1 und P2
Attribute/Variablen
x1, y1, x2, y2, farbe
Rechteck
mit dem linken oberen
Eckpunkt
P1, der Breite b und
der Höhe h
x1, y1, b, h, farbe
Kreis
mit dem Mittelpunkt P und
Durchmesser d
x1, y1, durchmesser,
farbe
mögliche Methoden
anzeigen()
loeschen()
verschieben()
farbeSetzen()
anzeigen()
loeschen()
verschieben()
fuellFarbeSetzen()
wie Rechteck
Eine Klasse beschreibt die Struktur und das Verhalten aller Objekte, die mit Hilfe der
Klasse erzeugt werden können (Klasse = Bauplan).
Als Klasse (class) bezeichnet man die Definition einer Idee, eines Konzepts, eines
Bauplans, einer Schablone.
Das Applet Ball02 wird nun schrittweise entwickelt.
Schritt 1: Wir beschreiben das Verhalten eines Ballons mit Hilfe der Klasse Ballon
(Im Beispiel verfügt der Ballon noch über keine Farbe!).
import java.awt.*;
public class Ballon {
private int durchmesser;
private int x1, y1;
// spaeter
private Color farbe =Color.black;
// Konstruktor: Eine spezielle Methode zur Initialisierung
// und Erzeugung des OBJEKTS (INSTANZ)
// Er muss denselben Namen wie die Klasse tragen
// Konstruktor ohne Farbe
public Ballon(int startD, int mitte_x, int mitte_y) {
durchmesser=startD;
x1 = mitte_x; y1 = mitte_y;
}
// spaeter Konstruktor mit Farbe
OOP in Klasse 11 © A. Wagner, Seite 9
public Ballon(int startD, int mitte_x, int mitte_y, Color f) {
durchmesser=startD;
x1 = mitte_x; y1 = mitte_y;
farbe= f;
}
public void anzeigen(Graphics g) {
g.setColor(farbe);
g.fillOval(x1-durchmesser/2, y1-durchmesser/2,
durchmesser,durchmesser);
}
public void groesseAendern(int veraenderung) {
durchmesser=durchmesser+veraenderung;
}
public void set_Color(Color c) {
farbe=c;
}
Color get_Color() {
return farbe;
}
public void verschieben(int z) {
x1 = x1 +z;
} // verschieben
} // class
Diese Klasse wird vom eigentlichen Applet als ein Datentyp benutzt.
OOP in Klasse 11 © A. Wagner, Seite 10
Die Deklaration und Objekterzeugung
Der Konstruktor Ballon(int startD, int mitte_x, int mitte_y)
Der Konstruktor dient zur Erzeugung des Objekts und der Initialisierung der
Attributvariablen.
Der Konstruktor muss denselben Namen wie die Klasse tragen.
Zur Erzeugung des OBJEKTS (INSTANZ) vom Typ Ballon wird der Konstruktor mit new
aufgerufen:
Die Initialisierung wird durch den Konstruktor vorgenommen; das neue Objekt weist einen
sinnvollen Anfangszustand auf.
Das Objekt (die Instanz) wird mit Hilfe der new-Anweisung erzeugt:
Ballon ball1 = new Ballon(50, 200, 200);
erzeugt ein Objekt mit allen Attributen und Methoden der Klasse Ballon.
Ein Beispiel aus dem Alltagsleben: Das blaue Auto mit dem Namen golfi ist ein Objekt
(eine Instanz) des Autotyps (Java-Klasse) Golf.
Der Bauplan des Typs Golf wird bei der Produktion (=Instanziierung) dieses blauen Autos
ausgeführt: golfi = new Golf( ...) .
Die Laufzeitumgebung von Java reserviert so viel Speicher, dass ein Ballon-Objekt mit
allen Attributen und Methoden darin Platz hat.
Kann das System nicht genügend Speicher bereitstellen, so generiert die
Laufzeitumgebung einen OutOfMemoryError.
OOP in Klasse 11 © A. Wagner, Seite 11
Die Applet-Klasse Ball02.java
Notwendiger Import:
import java.awt.*;
Im Konstruktor der Klasse Ball02 werden folgende Anweisungen eingefügt:
public Ball02() {
super();
initGUI();
ball1 = new Ballon(50,200,200, Color.BLACK);
// Farbe des Button setzen
jButton4.setBackground(farbe2);
}
Die Zeichenmethode
public void paint(Graphics g) {
// Notwendig, damit Hintergrund + Komponenten gezeichnet werden
super.paint(g);
// Auftrag an Objekt, sich zu zeichnen
ball1.anzeigen(g);
}
Anmerkungen zur paint-Methode
Die paint-Methode des Applets soll nicht direkt den Ball zeichnen, sondern dem Ball
mitteilen, dass er sich zeichnen soll.
Prinzip: Das aufgerufene Objekt weiß, was es zu tun hat!
Graphikkontext:
Der Graphikkontext (Die Graphics-Variable g) ist die Schnittstelle zwischen Ausgabegerät
(Graphiksystem) und Programm.
Die Klasse Graphics enthält die dafür notwendigen Methoden.
private void jButton1ActionPerformed(ActionEvent evt) {
//TODO add your code for jButton1.actionPerformed
repaint();
}
OOP in Klasse 11 © A. Wagner, Seite 12
Die Methode zum Vergrößern des Ballons
private void jButton2ActionPerformed(ActionEvent evt) {
//TODO add your code for jButton2.actionPerformed
ball_1.groesseAendern(3);
repaint();
}
Schritt 2 : Wir erweitern die Klasse Ballon so, dass auch Farben möglich sind. Die
Änderungen sind blau markiert.
import java.awt.*;
public class Ballon {
private int durchmesser;
private int x1, y1;
private Color farbe =Color.black;
// Konstruktor: Eine spezielle Methode zur Initialisierung
// und Erzeugung des OBJEKTS (INSTANZ)
// Er muss denselben Namen wie die Klasse tragen
// Konstruktor ohne Farbe
public Ballon(int startD, int mitte_x, int mitte_y) {
durchmesser=startD;
x1 = mitte_x; y1 = mitte_y;
}
public Ballon(int startD, int mitte_x, int mitte_y, Color f) {
durchmesser=startD;
x1 = mitte_x; y1 = mitte_y;
farbe= f;
}
public void anzeigen(Graphics g) {
g.setColor(farbe);
g.fillOval(x1-durchmesser/2, y1-durchmesser/2,
durchmesser,durchmesser);
}
public void groesseAendern(int veraenderung) {
durchmesser=durchmesser+veraenderung;
}
// weiter Methoden für später
public void set_Color(Color c) {
farbe=c;
OOP in Klasse 11 © A. Wagner, Seite 13
}
Color get_Color() {
return farbe;
}
public void verschieben(int z) {
x1 = x1 +z;
} // verschieben
} // class
Die folgende Anweisung erzeugt ein Objekt in blauer Farbe:
Ballon ball1 = new Ballon(50, 200, 200, Color.BLUE);
Konstruktoren
Zur Erzeugung von Objekten im Speicher wird durch den new-Operator der Konstruktor
aufgerufen.
•
•
•
•
Er hat denselben Namen wie die Klasse.
Er ist eine Methode ohne Rückgabetyp.
Durch den Konstruktoraufruf werden die Attributwerte des Objekts initialisiert.
Eine Klasse kann mehrere Konstruktoren besitzen (Polymorphie)
Die Objekte werden im Heap (Halde) angelegt.
OOP in Klasse 11 © A. Wagner, Seite 14
Das Klassendiagramm des kompletten Programms
Applet Ball02
Ballon
Ball02
- jButton1: JButton
- ball1: Ballon
+ paint(): void
- jButton1ActionPerformed(): void
- durchmesser: int
- x1: int
- y1: int
- farbe: Color
...
+ anzeigen(): void
+ groesseAendern(): void
+ set_Color(): void
+ get_Color(): Color
+ verschieben(): void
Aggregation
Die Klasse Ball02 steht in einer Einschlussbeziehung zur Klasse Ballon. Die umfassende Klasse
enthält Objekte der Klasse Ballon.
In JAVA:
class Ball02 {
...
Ballon ball1;
}
Eine Aggregation ist eine Einschlussbeziehung („hat“-Beziehung). Die Objekte werden
innerhalb der umfassenden Klasse als Attribut deklariert.
OOP in Klasse 11 © A. Wagner, Seite 15
Die Methoden von Ball02
public void paint(Graphics g) {
// Notwendig, damit Hintergrund + Komponenten gezeichnet werden
super.paint(g);
// Auftrag an Objekt, sich zu zeichnen
ball1.anzeigen(g);
}
private void jButton1ActionPerformed(ActionEvent evt) {
//System.out.println("jButton1.actionPerformed, event="+evt);
//TODO add your code for jButton1.actionPerformed
repaint();
}
private void jButton2ActionPerformed(ActionEvent evt) {
//System.out.println("jButton2.actionPerformed, event="+evt);
//TODO add your code for jButton2.actionPerformed
ball1.groesseAendern(3);
System.out.println("Grösser "+ball1.toString());
repaint();
}
private void jButton4ActionPerformed(ActionEvent evt) {
//System.out.println("jButton4.actionPerformed, event="+evt);
//TODO add your code for jButton4.actionPerformed
if (!ball1.get_Color().equals(farbe1)) {
ball1.set_Color(farbe1);
jButton4.setBackground(farbe2);
}
else {
ball1.set_Color(farbe2);
jButton4.setBackground(farbe1);
}
repaint();
}
private void jButton3ActionPerformed(ActionEvent evt) {
//System.out.println("jButton3.actionPerformed, event="+evt);
//TODO add your code for jButton3.actionPerformed
ball1.groesseAendern(-3);
repaint();
}
private void jButton5ActionPerformed(ActionEvent evt) {
System.out.println("jButton5.actionPerformed, event="+evt);
//TODO add your code for jButton5.actionPerformed
ball1.verschieben(5);
repaint();
}
private void jButton6ActionPerformed(ActionEvent evt) {
System.out.println("jButton6.actionPerformed, event="+evt);
//TODO add your code for jButton6.actionPerformed
ball1.verschieben(-5);
repaint();
}
OOP in Klasse 11 © A. Wagner, Seite 16