homedukeOOP mit Java: Objektorientierte Programmierung Prof. Dr. Uwe Schmidt FH Wedel

Objektorientierte Programmierung

weiter

weiter

Erweiterbarkeit

Bestehende Klassen können ohne physikalisches Kopieren erweitert werden.

Beispiel:

public
class ExtendedStack
  extends SimpleStack {
 
  // der Konstruktor
  // in diesem einfachen Fall ueberfluessig
 
  public
  ExtendedStack() {
      super();  // redundant
  }
 
  //--------------------
  // die zusaetzliche Funktion
 
  public
  int get() {
      int i = top();
      pop();
      return i;
  }
}
weiter
merke Konstruktoren müssen normalerweise immer in Unterklassen neu implementiert werden, Ausnahme ist der default-Konstruktor.
merke Der Beerbungsprozess kann beliebig oft wiederholt werden.

weiter

2. Vererbungsschritt

public
class ExtendedStack2
  extends ExtendedStack {
 
  // die zusaetzliche Funktion
 
  public
  Stack swap() {
    int e1 = get();
    int e2 = get()
 
    push(e1);
    push(e2);
 
    return this;
  }
}

weiter

Modifikation

Bestehende Klassen können mit Vererbung und Redefinition von Methoden in ihrer Funktionalität verändert werden.

Beispiel:

public
class SaveStack
  extends SimpleStack {
 
  // die modifizierte top Methode
 
  public
  int top() {
    if ( ! preTop() ) 
      throw
        new RuntimeException("top with empty stack");
 
    return
      super.top();
  }
 
  //--------------------
  // die modifizierte pop Methode
 
  public
  Stack pop() {
    if ( ! prePop() ) 
      throw
        new RuntimeException("pop with empty stack");
 
    return
      super.pop();
  }
}
weiter
merke Die überschriebenen Methoden können immer noch erreicht werden.
Das Schlüsselwort super schaltet auf den Namensraum der Oberklasse um.

weiter

Erweiterung um Datenkomponenten

Bestehende Klassen können mit Vererbung um Datenkomponenten erweitert werden

Beispiel:

public
class Point {
 
  public
  int x;
 
  public
  int y;
 
  public
  Point() {
    this(0,0);
  }
 
  public
  Point(int xint y) {
    this.x = x;
    this.y = y;
  }
}

Erweiterung:

public
class ColoredPoint
  extends Point {
 
  public
  int color;
 
  ColoredPoint() {
    super();            // redundant: default
    color = 0;
  }
 
  ColoredPoint(int xint yint color) {
    super(x,y);
    this.color = color;
  }
}
weiter
merke Es können nur zusätzliche Datenfelder definiert werden.
Eine Redefinition ist nicht möglich.
merke Überdeckte Felder können immer noch über super erreicht werden.

weiter

Sichtbarkeitsattribute

private
Variablen und Methoden einer Klasse sind nur innerhalb der Klasse selbst sichtbar.
weiter
merke
diese Komponenten können verändert werden, ohne dass Unterklassen davon beeinflusst werden.

Sicherheit, Modularität

weiter
merke
abgeleitete Klassen können die Information aus den private-Komponenten ihrer Basisklassen nicht zur Implementierung ihrer eigenen Operationen ausnutzen.

Effizienzverlust möglich

weiter
protected
Variablen und Methoden einer Klasse sind innerhalb der Klasse selbst und in Unterklassen sichtbar.

Außerdem sind diese Größen im zur Klasse gehörigen Paket sichtbar.

weiter
merke
Wenn diese Komponenten verändert werden, müssen möglicherweise abgeleitete Klassen und Klassen aus dem zugehörigen Paket modifiziert werden.
weiter
merke
Wartungsaufwand kann sich erhöhen
weiter
merke
Effizienz kann verbessert werden
weiter
Beispiel
class ProtectedSimpleStack
  extends Stack{
 
  // die Datenfelder
  // fuer Unterklassen sichtbar
 
  protected
  int [] a;
 
  protected
  int i;
 
  ...
}
 
weiter
effizientere get() Methode
public
class ProtectedExtendedStack
  extends ProtectedSimpleStack {
 
  public
  int get() {
    return
      a[i--];
  }
}
 
weiter
default
friendly
Variablen und Methoden einer Klasse sind in dem zur Klasse gehörigen Paket sichtbar.
weiter
merke
Wenn diese Komponenten verändert werden, müssen möglicherweise Klassen aus dem zugehörigen Paket modifiziert werden.
weiter
public
Variablen und Methoden einer Klasse sind überall sichtbar
weiter
merke
Sinnvoll nur für Methoden, Konstanten und Variablen, die nie verändert werden,
sonst keine Zugriffskontrolle mehr für Variablen.
weiter
final
als Attribut für Klassen verhindert weiteres Beerben.
weiter
Beispiel
für eine Klasse, die nicht mehr beerbt werden kann:
 
public
final
class ExtendedStack
  extends SimpleStack {
  ...
}
 
 
im JDK z.B. für Integer verwendet.
weiter
final
als Attribut für Methoden verhindert das Überschreiben von Methoden
weiter
Beispiel
für eine nicht weiter modifizierbare Methode
 
class X {
 
  public
  final
  void foo() {}
}
 
class Y
  extends X {
 
  public
  void foo() {}
}
Fehlermeldung
Final methods can't be overridden. Method void foo() is final in class X.
 
im JDK z.B. für getClass() aus Object verwendet.

Letzte Änderung: 10.05.2011
© Prof. Dr. Uwe Schmidt
Prof. Dr. Uwe Schmidt FH Wedel