83
Objektorientierte Programmierung in Java Algorithmen und Datenstrukturen II 1

Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

  • Upload
    dangthu

  • View
    213

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Objektorientierte Programmierung in Java

Algorithmen und Datenstrukturen II 1

Page 2: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Traditionelle Konzepte der Softwaretechnik

Folgende traditionelle Konzepte des Software-Engineering werden u.a. imobjektorientierten Ansatz verwendet:

Datenabstraktion (bzw. Datenkapselung) und Information HidingDie zentrale Idee der Datenkapselung ist, dass auf eine Datenstruktur nichtdirekt zugegriffen wird, indem etwa einzelne Komponenten gelesen odergeändert werden, sondern, dass dieser Zugriff ausschließlich überZugriffsoperatoren erfolgt. Es werden also die Implementierungen derOperationen und die Datenstrukturen selbst versteckt.

Vorteil: Implementierungdetails können beliebig geändert werden, ohneAuswirkung auf den Rest des Programmes zu haben.

Algorithmen und Datenstrukturen II 2

Page 3: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Traditionelle Konzepte der Softwaretechnik

Folgende traditionelle Konzepte des Software-Engineering werden u.a. imobjektorientierten Ansatz verwendet:

Datenabstraktion (bzw. Datenkapselung) und Information HidingDie zentrale Idee der Datenkapselung ist, dass auf eine Datenstruktur nichtdirekt zugegriffen wird, indem etwa einzelne Komponenten gelesen odergeändert werden, sondern, dass dieser Zugriff ausschließlich überZugriffsoperatoren erfolgt. Es werden also die Implementierungen derOperationen und die Datenstrukturen selbst versteckt.

Vorteil: Implementierungdetails können beliebig geändert werden, ohneAuswirkung auf den Rest des Programmes zu haben.

Algorithmen und Datenstrukturen II 2

Page 4: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

abstrakte Datentypen (ADT)Realisiert wird die Datenabstraktion duch den Einsatz abstrakter Datentypen,die Liskov & Zilles (1974) folgendermaßen definierten:

“An abstract data type defines a class of abstract objects which iscompletely characterized by the operations available on those objects.This means that an abstract data type can be defined by defining thecharacterizing operations for that type.”

Algorithmen und Datenstrukturen II 3

Page 5: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Oder etwas prägnanter:

Datentyp = Menge(n) von Werten + Operationen darauf

abstrakter Datentyp = Operationen auf Werten, deren Repräsentation nichtbekannt ist. Der Zugriff erfolgt ausschließlich über Operatoren.

Algorithmen und Datenstrukturen II 4

Page 6: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Oder etwas prägnanter:

Datentyp = Menge(n) von Werten + Operationen darauf

abstrakter Datentyp = Operationen auf Werten, deren Repräsentation nichtbekannt ist. Der Zugriff erfolgt ausschließlich über Operatoren.

Datenabstraktion fördert die Wiederverwendbarkeit von Programmteilen und dieWartbarkeit großer Programme.

Algorithmen und Datenstrukturen II 4

Page 7: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Beispiel: Der ADT Stack

Stack: Eine Datenstruktur über einem Datentyp T bezeichnet man als Stacka, wenndie Einträge der Datenstruktur als Folge organisiert sind und es die Operationenpush, pop und peek gibt:

Algorithmen und Datenstrukturen II 5

Page 8: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Beispiel: Der ADT Stack

Stack: Eine Datenstruktur über einem Datentyp T bezeichnet man als Stacka, wenndie Einträge der Datenstruktur als Folge organisiert sind und es die Operationenpush, pop und peek gibt:

push fügt ein Element von T stets an das Ende der Folge.pop entfernt stets das letzte Element der Folge.peek liefert das letzte Element der Folge, ohne sie zu verändern.

Algorithmen und Datenstrukturen II 5

Page 9: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Beispiel: Der ADT Stack

Stack: Eine Datenstruktur über einem Datentyp T bezeichnet man als Stacka, wenndie Einträge der Datenstruktur als Folge organisiert sind und es die Operationenpush, pop und peek gibt:

push fügt ein Element von T stets an das Ende der Folge.pop entfernt stets das letzte Element der Folge.peek liefert das letzte Element der Folge, ohne sie zu verändern.

Prinzip: last in first out (LIFO)

abedeutet soviel wie Keller oder Stapel

Algorithmen und Datenstrukturen II 5

Page 10: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Operatoren

Typen der Operationen: initStack: −→ Stack

push: T × Stack −→ Stack

pop: Stack −→ Stack

peek: Stack −→ T

empty: Stack −→ boolean

Algorithmen und Datenstrukturen II 6

Page 11: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Spezifikation

Spezifikation der Operationen durch Gleichungen. Sei x eine Variable vom Typ T,stack eine Variable vom Typ Stack:

empty (initStack) = true

empty (push (x, stack)) = false

peek (push (x, stack)) = x

pop (push (x, stack)) = stack

Algorithmen und Datenstrukturen II 7

Page 12: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Spezifikation

Spezifikation der Operationen durch Gleichungen. Sei x eine Variable vom Typ T,stack eine Variable vom Typ Stack:

empty (initStack) = true

empty (push (x, stack)) = false

peek (push (x, stack)) = x

pop (push (x, stack)) = stack

initStack und push sind Konstruktoren (sie konstruieren Terme), daher gibt eskeine Gleichungen für sie.

Algorithmen und Datenstrukturen II 7

Page 13: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Konzepte der objektorientierten Programmierung

Ziel jeglicher Programmierung ist:

• Modellierung von Ausschnitten der Realität

• sachgerechte Abstraktion

• realitätsnahes Verhalten

• Nachbildung von Ähnlichkeit im Verhalten

• Klassifikation von Problemen

Algorithmen und Datenstrukturen II 8

Page 14: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Phylogenetische Klassifizierung

Tiere���

����� ?

HHHHHHHj

Insekten Fische Säugetiere

��� ?

@@@R

��� ?

@@@R

��� ?

@@@R

Algorithmen und Datenstrukturen II 9

Page 15: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Ökonomische Klassifizierung

Tiere��

������ ?

HHHHH

HHj

Zuchttiere Wild Störtiere

��� ?

@@@R

��� ?

@@@R

��� ?

@@@R

Algorithmen und Datenstrukturen II 10

Page 16: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Drei Vorgehensweisen im Systementwurf

1. die funktionsorientierte

2. die datenorientierte

3. die objektorientierte

Algorithmen und Datenstrukturen II 11

Page 17: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Der Kerngedanke des objektorientierten Ansatzes besteht darin, Daten undFunktionen zu verschmelzen. Im ersten Schritt werden die Daten abgeleitet, imzweiten Schritt werden den Daten die Funktionen zugeordnet, die sie manipulieren.Die entstehenden Einheiten aus Daten und Funktionen werden Objekte genannt.

Algorithmen und Datenstrukturen II 12

Page 18: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Der Kerngedanke des objektorientierten Ansatzes besteht darin, Daten undFunktionen zu verschmelzen. Im ersten Schritt werden die Daten abgeleitet, imzweiten Schritt werden den Daten die Funktionen zugeordnet, die sie manipulieren.Die entstehenden Einheiten aus Daten und Funktionen werden Objekte genannt.Wir schränken den Begriff Objektorientierung gemäß folgender Gleichung vonCoad & Yourdon weiter ein:

Objektorientierung = Klassen und Objekte

+ Kommunikation mit Nachrichten

+ Vererbung

Algorithmen und Datenstrukturen II 12

Page 19: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Einfachvererbung

Object

��� ?

@@@R

System Math Point

@@@R

...

Algorithmen und Datenstrukturen II 13

Page 20: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Mehrfachvererbung

. . .

���

@@@R

Tiere Pflanzen

@@@R

���

Fleischfresser

@@@R

. . .

Algorithmen und Datenstrukturen II 14

Page 21: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Klasse Object

Object oref = new Point();

oref = "eine Zeichenkette";

Algorithmen und Datenstrukturen II 15

Page 22: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Konstruktoren und Initialisierungsblöcke

Algorithmen und Datenstrukturen II 16

Page 23: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

public class Circle {

int x=0, y=0, r=1;

static int numCircles=0;

public Circle() {

numCircles++;

}

public double circumference() {

return 2*Math.PI*r;

}

public double area() {

return Math.PI*r*r;

}

Algorithmen und Datenstrukturen II 17

Page 24: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

public static void main(String[] args) {

Circle c = new Circle();

System.out.println(c.r);

System.out.println(c.circumference());

System.out.println(c.area());

System.out.println(numCircles);

}

}

Algorithmen und Datenstrukturen II 18

Page 25: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Konstruktor mit Parametern

public Circle(int xCoord, int yCoord, int radius) {

numCircles++;

x = xCoord;

y = yCoord;

r = radius;

}

Algorithmen und Datenstrukturen II 19

Page 26: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

mit this-Referenz

public Circle(int x, int y, int r) {

numCircles++;

this.x = x;

this.y = y;

this.r = r;

}

Algorithmen und Datenstrukturen II 20

Page 27: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Überladen von Konstruktoren

Algorithmen und Datenstrukturen II 21

Page 28: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

public class Circle {

int x = 0, y = 0, r = 1;

static int numCircles;

public Circle() {

numCircles++;

}

public Circle(int x, int y, int r) {

this();

this.x = x;

this.y = y;

this.r = r;

}

Algorithmen und Datenstrukturen II 22

Page 29: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

public Circle(int r) {

this(0,0,r);

}

public static void main(String[] args) {

Circle c1 = new Circle();

Circle c2 = new Circle(1,1,2);

Circle c3 = new Circle(3);

System.out.println(numCircles);

}

}

Algorithmen und Datenstrukturen II 23

Page 30: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Komplexe Initialisierung von Klassenvariablenpublic class Circle {

public static double[] sines = new double[1000];

public static double[] cosines = new double[1000];

static {

double x, delta_x;

int i;

delta_x = (Math.PI/2)/(1000-1);

for(i=0,x=0; i<1000; i++,x+=delta_x) {

sines[i] = Math.sin(x);

cosines[i] = Math.cos(x);

}

}

}

Algorithmen und Datenstrukturen II 24

Page 31: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Java-Klassen als Realisierung und Implementierung von

abstrakten Datentypen

Durch den Modifizierer private können wir Implementierungsdetails verstecken,denn als private deklarierte Attribute und Methoden sind nur in der Klasse selbstzugreifbara. Folgende Klasse implementiert einen ADT Stack mittels eines Feldes:

aSynonyme für Zugreifbarkeit sind: Gültigkeit bzw. Sichtbarkeit.

Algorithmen und Datenstrukturen II 25

Page 32: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Algorithmen und Datenstrukturen II 26

Page 33: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

public class Stack {

private Object[] stack;

private int top = -1;

private static final int CAPACITY = 10000;

/** liefert einen leeren Keller. */

public Stack() {

stack = new Object[CAPACITY];

}

/** legt ein Objekt im Keller ab und liefert dieses Objekt

zusaetzlich zurueck. */

public Object push(Object item) {

Algorithmen und Datenstrukturen II 27

Page 34: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

stack[++top] = item;

return item;

}

/** entfernt das oberste Objekt vom Keller und liefert es zurueck.

Bei leerem Keller wird eine Fehlermeldung ausgegeben und

null zurueckgeliefert. */

public Object pop() {

if (empty()) {

System.out.println("Method pop: empty stack");

return null;

}

else

return stack[top--];

}

Algorithmen und Datenstrukturen II 28

Page 35: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

/** liefert das oberste Objekt des Kellers, ohne ihn zu veraendern.

Bei leerem Keller wird eine Fehlermeldung ausgegeben und

null zurueckgeliefert. */

public Object peek() {

if (empty()) {

System.out.println("Method peek: empty stack");

return null;

}

else

return stack[top];

}

/** liefert true genau dann, wenn der Keller leer ist. */

Algorithmen und Datenstrukturen II 29

Page 36: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

public boolean empty() {

return (top == -1);

}

/** liefert die Anzahl der Elemente des Kellers. */

public int size() {

return top+1;

}

}

Algorithmen und Datenstrukturen II 30

Page 37: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Der Dokumentationskommentar /** ... */ wird zur automatischenDokumentierung der Attribute und Methoden einer Klasse benutzt. Das Programmjavadoc generiert ein HTML-File, in dem alle sichtbaren Attribute und Methodenmit deren Parameterlisten aufgezeigt und dokumentiert sind.

> javadoc Stack.java

Dieses HTML-File ist der Vertrag (die Schnittstelle) der Klasse und entspricht demADT Stack, wobei die Operationen bzw. Methoden allerdings nurnatürlichsprachlich spezifiziert wurden. Die obige verbale Spezifikation entsprichtweitgehend der der vordefinierten Java-Klasse Stack (genauer java.util.Stack).Man beachte, dass (aus diesem Grund) die obige Spezifikation von derGleichungsspezifikation aus dem Unterabschnitt ?? abweicht.

Algorithmen und Datenstrukturen II 31

Page 38: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Methoden in Java

1. Methoden und Signaturen

2. Überladen von Methoden

3. Wertübergabe (call by value)

Algorithmen und Datenstrukturen II 32

Page 39: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

call by value

Die Parameterübergabe zu Methoden erfolgt in Java durch Wertübergabe (call byvalue). D.h., dass Werte von Parametervariablen in einer Methode Kopien der vomAufrufer angegebenen Werte sind. Das nächste Beispiel verdeutlicht dies.

Algorithmen und Datenstrukturen II 33

Page 40: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

public class CallByValue {

public static int sqr(int i) {

i = i*i;

return(i);

}

public static void main(String[] args) {

int i = 3;

System.out.println(sqr(i));

System.out.println(i);

}

}

> java CallByValue

9

3

Algorithmen und Datenstrukturen II 34

Page 41: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Allerdings ist zu beachten, dass nicht Objekte, sondern Objektreferenzenübergeben werden. Wir betrachten unser Standardbeispiel Circle in folgenderabgespeckter Form (gemäß der Devise, Implementierungsdetails zu verbergen,werden die Datenfelder als private deklariert).

Algorithmen und Datenstrukturen II 35

Page 42: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

public class Circle {

private int x,y,r;

public Circle(int x, int y, int r) {

this.x = x;

this.y = y;

this.r = r;

}

public double circumference() {

return 2 * Math.PI * r;

}

public double area() {

return Math.PI * r * r;

}

Algorithmen und Datenstrukturen II 36

Page 43: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

public static void setToZero (Circle arg) {

arg.r = 0;

arg = null;

}

public static void main(String[] args) {

Circle kreis = new Circle(10,10,1);

System.out.println("vorher : r = "+kreis.r);

setToZero(kreis);

System.out.println("nachher: r = "+kreis.r);

}

}

Algorithmen und Datenstrukturen II 37

Page 44: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

> java Circle

vorher : r = 1

nachher: r = 0

Algorithmen und Datenstrukturen II 38

Page 45: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

> java Circle

vorher : r = 1

nachher: r = 0

Dieses Verhalten entspricht jedoch nicht der Parameterübergabe call by reference,denn bei der Wertübergabe wird eine Kopie der Referenz erzeugt und dieursprüngliche Referenz bleibt erhalten. Bei call by reference würde die übergebeneReferenz eben nicht kopiert und daher in der Methode setToZero auf nullgesetzt.

Algorithmen und Datenstrukturen II 38

Page 46: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Unterklassen und Vererbung in Java

Algorithmen und Datenstrukturen II 39

Page 47: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

import java.awt.Color;

import java.awt.Graphics;

public class GraphicCircle extends Circle {

protected Color outline; // Farbe der Umrandung

protected Color fill; // Farbe des Inneren

public GraphicCircle(int x,int y,int r,Color outline) {

super(x,y,r);

this.outline = outline;

this.fill = Color.lightGray;

}

public GraphicCircle(int x,int y,int r,Color outline,Color fill) {

this(x,y,r,outline);

this.fill = fill;

Algorithmen und Datenstrukturen II 40

Page 48: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

}

public void draw(Graphics g) {

g.setColor(outline);

g.drawOval(x-r, y-r, 2*r, 2*r);

g.setColor(fill);

g.fillOval(x-r, y-r, 2*r, 2*r);

}

public static void main(String[] args) {

GraphicCircle gc = new GraphicCircle(0,0,100,Color.red,Color.blue);

double area = gc.area();

System.out.println(area);

Circle c = gc;

double circumference = c.circumference();

Algorithmen und Datenstrukturen II 41

Page 49: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

System.out.println(circumference);

GraphicCircle gc1 = (GraphicCircle) c;

Color color = gc1.fill;

System.out.println(color);

}

}

Algorithmen und Datenstrukturen II 42

Page 50: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Color und Graphics

Color und Graphics sind vordefinierte Klassen, die durch import zugreifbargemacht werden (vgl. Abschnitt ??). Diese Klassen werden z.B. in [?] beschrieben.Zum Verständnis reicht es hier zu wissen, dass der erste Konstruktor denKonstruktor seiner Oberklasse aufruft (vgl. Abschnitt ??) und das Kreisinnere dieFarbe hellgrau erhält, sowie, dass die Methode draw einen farbigen Kreis zeichnet.

Algorithmen und Datenstrukturen II 43

Page 51: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Da GraphicCircle alle Methoden von Circle erbt, können wir z.B. denFlächeninhalt eines Objektes gc vom Typ GraphicCircle berechen durch:

double area = gc.area();

Jedes Objekt gc vom Typ GraphicCircle ist ebenfalls ein Objekt vom Typ Circle

bzw. vom Typ Object. Deshalb sind folgende Zuweisungen korrekt.

Circle c = gc;

double area = c.area();

Man kann c durch castinga in ein Objekt vom Typ GraphicCircle

zurückverwandeln.aexplizite Typumwandlung

Algorithmen und Datenstrukturen II 44

Page 52: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

GraphicCircle gc1 = (GraphicCircle)c;

Color color = gc1.fill;

Die oben gezeigte Typumwandlung funktioniert nur, weil c tatsächlich ein Objektvom Typ GraphicCircle ist.

Algorithmen und Datenstrukturen II 45

Page 53: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Überschreiben von Methoden und Verdecken von

Datenfeldern

Wir betrachten folgendes Java-Programm (Arnold & Gosling [?], S. 66):

public class SuperShow {

public String str = "SuperStr";

public void show() {

System.out.println("Super.show: "+str);

}

}

Algorithmen und Datenstrukturen II 46

Page 54: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Überschreiben von Methoden und Verdecken von

Datenfeldern

Wir betrachten folgendes Java-Programm (Arnold & Gosling [?], S. 66):

public class SuperShow {

public String str = "SuperStr";

public void show() {

System.out.println("Super.show: "+str);

}

}

Algorithmen und Datenstrukturen II 46

Page 55: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

public class ExtendShow extends SuperShow {

public String str = "ExtendStr";

public void show() {

System.out.println("Extend.show: "+str);

}

public static void main(String[] args) {

ExtendShow ext = new ExtendShow();

SuperShow sup = ext;

sup.show();

ext.show();

System.out.println("sup.str = "+sup.str);

System.out.println("ext.str = "+ext.str);

}

}

Algorithmen und Datenstrukturen II 47

Page 56: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Verdecken von Datenfeldern

Jedes ExtendShow-Objekt hat zwei String-Variablen, die beide str heißen undvon denen eine ererbt wurde. Die neue Variable str verdeckt die ererbte; wir sagenauch die ererbte ist verborgen. Sie existiert zwar, man kann aber nicht mehr durchAngabe ihres Namens auf sie zugreifen.

Algorithmen und Datenstrukturen II 48

Page 57: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Überschreiben von Methoden

Wenn eine Methode von einem Objekt aufgerufen wird, dann bestimmt immer dertatsächliche Typ des Objektes, welche Implementierung benutzt wird. Bei einemZugriff auf ein Datenfeld wird jedoch der deklarierte Typ der Referenz verwendet.Daher erhalten wir folgende Ausgabe beim Aufruf der main-Methode:

> java ExtendShow

Extend.show: ExtendStr

Extend.show: ExtendStr

sup.str = SuperStr

ext.str = ExtendStr

Algorithmen und Datenstrukturen II 49

Page 58: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Die Objektreferenz super

Das Schlüsselwort super kann in allen objektbezogenen Methoden undKonstruktoren verwendet werden. In Datenfeldzugriffen und Methodenaufrufenstellt es eine Referenz zum aktuellen Objekt als eine Instanz seiner Oberklasse dar.Wenn super verwendet wird, so bestimmt der Typ der Referenz über die Auswahlder zu verwendenden Methodenimplementierung. Wir illustrieren dies wieder aneinem Beispielprogramm.

Algorithmen und Datenstrukturen II 50

Page 59: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

super Beispiel

public class T1 {

protected int x = 1;

protected String s() {

return "T1";

}

}

Algorithmen und Datenstrukturen II 51

Page 60: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Algorithmen und Datenstrukturen II 52

Page 61: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

public class T2 extends T1 {

protected int x = 2;

protected String s() {

return "T2";

}

protected void test() {

System.out.println("x= "+x);

System.out.println("super.x= "+super.x);

System.out.println("((T1)this).x= "+((T1)this).x);

System.out.println("s(): "+s());

System.out.println("super.s(): "+super.s());

System.out.println("((T1)this).s(): "+((T1)this).s());

}

Algorithmen und Datenstrukturen II 53

Page 62: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

public static void main(String[] args) {

new T2().test();

}

}

Algorithmen und Datenstrukturen II 54

Page 63: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

> java T2

x= 2

super.x= 1

((T1)this).x= 1

s(): T2

super.s(): T1

((T1)this).s(): T2

Algorithmen und Datenstrukturen II 55

Page 64: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Konstruktoren in Unterklassen

In Konstruktoren der Unterklasse kann direkt einer der Oberklassenkonstruktorenmittels des super() Konstruktes aufgerufen werden.

Achtung: Der super-Aufruf muss die erste Anweisung des Konstruktors sein!

Algorithmen und Datenstrukturen II 56

Page 65: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Wird kein Oberklassenkonstruktor explizit aufgerufen, so wird der parameterloseKonstruktor der Oberklasse automatisch aufgerufen, bevor die Anweisungen desneuen Konstruktors ausgeführt werden. Verfügt die Oberklasse nicht über einenparameterlosen Konstruktor, so muss ein Konstruktor der Oberklasse explizit mitParametern aufgerufen werden, da es sonst einen Fehler bei der Übersetzung gibt.

Algorithmen und Datenstrukturen II 57

Page 66: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Wird kein Oberklassenkonstruktor explizit aufgerufen, so wird der parameterloseKonstruktor der Oberklasse automatisch aufgerufen, bevor die Anweisungen desneuen Konstruktors ausgeführt werden. Verfügt die Oberklasse nicht über einenparameterlosen Konstruktor, so muss ein Konstruktor der Oberklasse explizit mitParametern aufgerufen werden, da es sonst einen Fehler bei der Übersetzung gibt.

Ausnahme: Wird in der ersten Anweisung eines Konstruktors ein andererKonstruktor derselben Klasse mittels this aufgerufen, so wird nichtautomatisch der parameterlose Oberklassenkonstruktor aufgerufen.

Algorithmen und Datenstrukturen II 57

Page 67: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Java liefert einen voreingestellten parameterlosen Konstruktor für eine erweiterndeKlasse, die keinen Konstruktor enthält. Dieser ist äquivalent zu:

public class ExtendedClass extends SimpleClass {

public ExtendedClass () {

super();

}

}

Der voreingestellte Konstruktor hat dieselbe Sichtbarkeit wie seine Klasse.

Algorithmen und Datenstrukturen II 58

Page 68: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Ausnahme: Enthält die Oberklasse keinen parameterlosen Konstruktor, so muss dieUnterklasse mindestens einen Konstruktor bereitstellen.

Algorithmen und Datenstrukturen II 59

Page 69: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Reihenfolgeabhängigkeit von Konstruktoren

Wird ein Objekt erzeugt, so werden zuerst alle seine Datenfelder auf voreingestellteWerte initialisiert. Jeder Konstruktor durchläuft dann drei Phasen:

• Aufruf des Konstruktors der Oberklasse.

• Initialisierung der Datenfelder mittels der Initialisierungsausdrücke.

• Ausführung des Rumpfes des Konstruktors.

Algorithmen und Datenstrukturen II 60

Page 70: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Algorithmen und Datenstrukturen II 61

Page 71: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

public class X {

protected String infix = "fel";

protected String suffix;

protected String alles;

public X() {

suffix = infix;

alles = verbinde("Ap");

}

public String verbinde(String original) {

return (original+suffix);

}

}

Algorithmen und Datenstrukturen II 62

Page 72: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

public class Y extends X {

protected String extra = "d";

public Y() {

suffix = suffix+extra;

alles = verbinde("Biele");

}

public static void main(String[] args) {

new Y();

}

}

Algorithmen und Datenstrukturen II 63

Page 73: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Schritt Aktion infix extra suffix alles

0 Datenfelder auf Voreinstellungen

1 Y-Konstruktor aufgerufen

2 X-Konstruktor aufgerufen

3 X-Datenfeld initialisiert fel

4 X-Konstruktor ausgeführt fel fel Apfel

5 Y-Datenfeld initialisiert fel d fel Apfel

6 Y-Konstruktor ausgeführt fel d feld Bielefeld

Algorithmen und Datenstrukturen II 64

Page 74: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Abstrakte Klassen und Methoden

Es gilt:

Algorithmen und Datenstrukturen II 65

Page 75: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Abstrakte Klassen und Methoden

Es gilt:

• eine abstrakte Methode hat keinen Rumpf;

Algorithmen und Datenstrukturen II 65

Page 76: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Abstrakte Klassen und Methoden

Es gilt:

• eine abstrakte Methode hat keinen Rumpf;

• jede Klasse, die eine abstrakte Methode enthält, ist selbst abstrakt und muss alssolche gekennzeichnet werden;

Algorithmen und Datenstrukturen II 65

Page 77: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Abstrakte Klassen und Methoden

Es gilt:

• eine abstrakte Methode hat keinen Rumpf;

• jede Klasse, die eine abstrakte Methode enthält, ist selbst abstrakt und muss alssolche gekennzeichnet werden;

• jede abstrakte Klasse muss mindestens eine abstrakte Methode besitzen;

Algorithmen und Datenstrukturen II 65

Page 78: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Abstrakte Klassen und Methoden

Es gilt:

• eine abstrakte Methode hat keinen Rumpf;

• jede Klasse, die eine abstrakte Methode enthält, ist selbst abstrakt und muss alssolche gekennzeichnet werden;

• jede abstrakte Klasse muss mindestens eine abstrakte Methode besitzen;

• man kann von einer abstrakten Klasse keine Objekte erzeugen;

Algorithmen und Datenstrukturen II 65

Page 79: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Abstrakte Klassen und Methoden

Es gilt:

• eine abstrakte Methode hat keinen Rumpf;

• jede Klasse, die eine abstrakte Methode enthält, ist selbst abstrakt und muss alssolche gekennzeichnet werden;

• jede abstrakte Klasse muss mindestens eine abstrakte Methode besitzen;

• man kann von einer abstrakten Klasse keine Objekte erzeugen;

• von einer Unterklasse einer abstrakten Klasse kann man Objekte erzeugen –vorausgesetzt sie überschreibt alle abstrakten Methoden der Oberklasse undimplementiert diese;

Algorithmen und Datenstrukturen II 65

Page 80: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Abstrakte Klassen und Methoden

Es gilt:

• eine abstrakte Methode hat keinen Rumpf;

• jede Klasse, die eine abstrakte Methode enthält, ist selbst abstrakt und muss alssolche gekennzeichnet werden;

• jede abstrakte Klasse muss mindestens eine abstrakte Methode besitzen;

• man kann von einer abstrakten Klasse keine Objekte erzeugen;

• von einer Unterklasse einer abstrakten Klasse kann man Objekte erzeugen –vorausgesetzt sie überschreibt alle abstrakten Methoden der Oberklasse undimplementiert diese;

Algorithmen und Datenstrukturen II 65

Page 81: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

• eine Unterklasse, die nicht alle abstrakten Methoden der Oberklasseimplementiert ist selbst wieder abstrakt.

Algorithmen und Datenstrukturen II 66

Page 82: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

Beispiel Benchmark

public abstract class Benchmark {

public abstract void benchmark();

public long repeat(int count) {

long start = System.currentTimeMillis();

for(int i=0; i<count; i++)

benchmark();

return (System.currentTimeMillis()-start);

}

}

Algorithmen und Datenstrukturen II 67

Page 83: Objektorientierte Programmierung in Java · Traditionelle Konzepte der Softwaretechnik Folgende traditionelle Konzepte des Software-Engineering werden u.a. im objektorientierten Ansatz

public class MethodBenchmark extends Benchmark {

public void benchmark() { }

public static void main(String[] args) {

int count = Integer.parseInt(args[0]);

long time = new MethodBenchmark().repeat(count);

System.out.println(count+" Methodenaufrufe in "+time+

" Millisekunden");

}

}

Algorithmen und Datenstrukturen II 68