Transcript
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