Begriffe des Objektorientierten Programmierens

Datenfeld Datenfelder speichern die Daten, die ein Objekt benutzt. Datenfelder werden auch als Instanzvariablen bezeichnet.

Kommentar Kommentare werden im Quelltext einer Klasse angegebn, um dem menschlichen Leser Erläuterungen zu geben. Sie haben keinen Einfluss auf die Funktionalität einer Klasse.

Compiler Ein Entwicklungswerkzeug, das Quelltext in Maschinensprache übersetzt. In Java übersetzt der Compiler den Quelltext in Bytecode.

Instanz Mit Instanz ist in der Regel Objekt gemeint.

Klasse Bauanleitung für Objete

Konstruktor Konstruktoren ermöglichen, dass ein Objekt nach seiner Erzeugung in einen gültigen Zustand versetzt wird.

Garbage Collector Zum Entfernen nicht mehr benötigter Objekte stellt Java den Mechanismus der Garbage Collection bereit. Der Garbage Collector sucht in gewissen Abständen nach Objekten, die nicht mehr referenziert werden. Werden solche Objekte gefunden, so werden sie aus dem Speicher entfernt. Um ein nicht mehr benötigtes Objekt für den Garbage Collector freizugeben, müssen wir dafür sorgen, dass keine Referenz mehr darauf verweist. Wir können dies beispielsweise so erreichen:

  abc = null;

Sichtbarkeit Durch die Sichtbarkeit einer Variablen wird der Bereich innerhalb des Quelltextes definiert, in dem eine Variable zugreifbar ist.

Objekt Eine speziele benutzerdefinierte Variable, die Daten und Methoden kapselt.

Objektvariable Variable, die nur für ein spezielles Objekt gültig ist.

Methoden Alle Methoden gehören immer zu einer Klasse und bestehen aus einem Kopf und einem Rumpf. Der Kopf setzt sich aus der Angabe der Sichtbarkeit, des Typs und des Rückgabewerts sowie aus der Signatur zusammen. Der Rumpf besteht aus Anweisungen.

Vererbung Bezeichnung für eine enge Beziehung zwischen einer Ober- und einer Unterklasse oder zwischen zwei Anwendungsfällen.

Zustände Flexible Attribute beschreiben den Zustand des Objekts. Zum Beispie die Geschwindigkeit, wie schnell sich gerade etwas bewegt. Der Zustand eines Objekts kann sich ändern.

Zuweisung Zuweisungen speichern den Wert auf der rechten Seite eines Zuweisungsoperators in der Variablen, die auf der linken Seite genannt ist.

Bedingte Anweisung Eine bedingte Anweisung führt eine von zwei Aktionen aus, abhänging vom Ergebnis einer Prüfung.

Lokale Variable Eine lokale Variable ist eine Variable, die innerhalb einer Methode deklariert und benutzt wird. Sie ist nur innerhalb der Methode zugreifbar und ihre Lebensdauer entspricht der ihrer Methode.

Unterschiede zwischen Objektvariablen und elementaren Variablen

Java unterscheidet zwischen zwei Typen bei den Variablen. Es gibt die elementaren Variablen, die von den Java-Entwicklern festgelegt wurden, und die Objektvariablen, die aus Klassen erzeugt werden. Objektvariablen beziehen sich auf andere Klassen und bringen eigene Methoden und Instanzvariablen mit sich.

Bei der Deklaration unterscheiden sich die beiden Typen nicht sonderlich. Sie werden in den Datenfeldern deklariert und im Arbeitsspeicher wird Platz frei gehalten. Sie unterscheiden sich durch die Angabe ihres Typs: Die elementaren Variablen-Typen beginnen mit einem kleinen Buchstaben, während die Objektvariablen-Typen mit einem Großbuchstaben beginnen müssen.

Bei der Intitialisierung wird den elementaren Variablen ihr Startwert zugewiesen. Bei den Objektvariablen muss erst ein neues Objekt vom Objekttyp erzeugt werden, ggf. mit Werten der Instanzvariablen.

Bei der Veränderung der Werte einer elementaren Variable muss ihr einfach ein neuer Wert zugewiesen werden. Die Objektvariablen müssen direkt angesprochen werden, und dann mit der Methode aus der gespeicherten Referenz angesprochen werden.

Wie schon bei der Veränderung deutlich geworden ist, speichern elementare Variablen einen Wert, während Objektvariablen eine Referenz speichern.

Hier noch eine kurze Tabelle, die das wichtigste zusammenfasst und für Tests hilfreich sein kann:

Objektvariable „normale Variablen“
Typ: Objekttypen
(aus Klassen)
elementare Typen
(int,double…)
Deklarieren: Typ name; typ name; im Datenfeld
Initialisieren: name = new Typ(); name = irgendeinwert; im Konstruktor
Veränderung: name.veraendere(); name = neuerWert; in Methoden
enthält: Referenzen Werte

Klassendiagramm

Klassendiagramme geben einen schnellen Überblick darüber, wie mehrere Klassen miteinander verbunden sind. Die einfachsten Klassendiagrammen werden schon bei BlueJ angezeigt. Sie zeigen die Klassennamen und durch einen Pfeil ihre Beziehung.

Beispiel:

Klassendiagramm (BlueJ)

UML-Diagramme sind ausführlichere Klassendiagramme. Sie zeigen zusätzlich die Instanzvariablen und die Objektmethoden. Am Anfang jeder Zeile steht entweder ein + oder ein - . Sie stehen für public (das + ) bzw. für private (das - ).

Bei den Instanzvariablen, und auch allen weiteren lokalen Variablen, wird zuerst der name geschrieben und dann der Typ. Also nicht so wie bei der Deklaration! Zwischen Name und Typ steht ein Doppelpunkt.

In einem weiteren Feld stehen der Konstruktor und die Methoden. Hier zeigen ein ! und ein ? an, ob es sich um eine verändernde Methode (das ! ) oder eine sondierende Methode (das ? ) handelt. Anschließend folgt der Methodenname und in den Klammern die lokalen Variablen, falls sie vorhanden sind, wie bei den Instanzvariablen. Bei den sondierenden Methoden muss noch der Typ angegeben werden, der zurückgegeben wird.

Beispiel:

Uhrenanzeige
- minuten: Nummernanzeige
- stunden: Nummernanzeige
- zeitanzeige: String
+ ! Uhrenanzeige()
+ ! Uhrenanzeige(startStunde: int; startMinute: int)
+ ! setze Uhrzeit(neuStunde: int; neuMinute: int)
+ ! taktsignalGeben()
+ ! zeitanzeigeAktualisieren()
+ ? gibUhrzeit(): String
Nummernanzeige
- limit: int
- wert: int
+ ! Nummeranzeige(anzeigeLimit: int)
+ ! erhoehen()
+ ! setzeWert(ersatzWert: int)
+ ? gibAnzeigewert(): String
+ ? gibWert(): int

Objektdiagramm

Objektdiagramme geben Auskunft über die gespeicherten Werte der Instanzvariablen. Da sich die Werte nach einigen Methoden ändern, sind die Objektdiagramme dynamisch.

In einem Objektdiagramm steht in der obersten Zeile in einem Kästchen der Name der Klasse und dann der Typ. Darunter kommen die Instanzvariablen. In einem Feld daneben werden die "Werte" angegeben: Wenn es sich um primitive Variablentypen handelt, werden die Werte gespeichert. Bei Objekttypen wird eine Referenz gespeichert, die durch einen Pfeil in ein weiteres Kästchen gezeigt wird. Mit diesem weiteren Kästchen ist eine andere Klasse dargestellt, also ebenfalls erst Name und Typ und darunter die Variablen.

Beispiel:

Objektdiagramm (BlueJ)

Bei BlueJ können Objektdiagramme auch sofort angeschaut werden. Dazu muss ein neues Objekt erstellt werden und anschließend auf Inspizieren klicken. Dort werden die gespeicherten Werte und Referenzen ebenfalls dargestellt.

Beispiel:

Objektdiagramm bei BlueJ

Objektinteraktion

Am Beispiel der Modellierung der Anzeige einer Digitaluhr (4-stellige 24-Stunden Anzeige) soll im Folgenden demonstriert werden, wie Objekte miteinander kommunizieren können. Bisher haben wir jeweils eine Klasse geschrieben und Objekte von dieser Klasse erzeugt. Nun wollen wir eine Klasse schreiben, deren Objekte andere Objekte erzeugen und diese manipulieren können.

Eine Digitaluhr besteht aus zwei 2-stelligen Nummernanzeigen, die grundsätzlich nach dem gleichen Prinzip funktionieren. Beide werden fortlaufend um Eins hochgezählt und springen, wenn sie einen gewissen Grenzwert erreicht haben (bei Stunden 24, bei Minuten 60) wieder auf den Wert Null zurück. Wir ignorieren hier also zunächst bestimmte Details und lenken den Focus der Betrachtung auf eine höhere Ebene, auf der eine gemeinsame Struktur sichtbar wird. Dieses Vorgehen wird als Abstraktion bezeichnet. Da die Struktur von Stunden- und Minutenanzeige viele Gemeinsamkeiten aufweist, werden wir beide Anzeigen in einer - sozusagen allgemeineren - Klasse implementieren. Diese Klasse modelliert Nummernanzeigen mit beliebigem Grenzwert.

In einem zweiten Schritt soll dann die Anzeige der Digitaluhr realisiert werden. Digitaluhr-Objekte sollen jeweils zwei Nummernanzeige-Objekte enthalten, die sie für die Anzeige von Stunden bzw. Minuten nutzen. Dazu müssen Digitaluhr-Objekte Nummernanzeige-Objekte erzeugen und die in diesen Objekten gespeicherten Werte verändern (z.B. beim Stellen der Uhr).

Bei dem hier beschriebenen Vorgehen kommt als weiteres wichtiges Prinzip neben der Abstraktion die Modularisierung zum Einsatz. Modularisierung ist der Prozess der Zerlegung eines Ganzen in wohl definierte Teile, die getrennt erstellt und untersucht werden können und die in wohl definierter Weise interagieren. Nach dem Prinzip der Modularisierung wird die Aufgabe also in zwei Teile zerlegt: Zunächst realisieren wir eine Klasse „Nummernanzeige“ für eine zweistellige Anzeige, von der wir dann zwei Objekte innerhalb einer Klasse „Uhrenanzeige“ für eine vierstellige Digitaluhranzeige verwenden.

Modularisierung und Abstraktion sind komplementär. Modularisierung bedeutet, große Dinge (Probleme, Aufgaben) in kleinere Teile zu zerlegen, während Abstraktion die Fähigkeit ist, Details zu ignorieren, um das Gesamtbild erfassen zu können.

Die Klasse Nummernanzeige
public class Nummernanzeige
{
  private int grenzwert;
  private int wert;
 
  /**
  * Konstruktor für Exemplare der Klasse Nummernanzeige
  */
  public Nummernanzeige(int grenze)
  {
    grenzwert = grenze;
    wert = 0;
  }
 
}
Die Klasse Digitaluhr
public class Digitaluhr
{
  private Nummernanzeige stunden;
  private Nummernanzeige minuten;
 
  /**
  * Konstruktor für ein Exemplar von Digitaluhr.
  * Mit diesem Konstruktor wird die Anzeige auf 00:00 initialisiert.
  */
  public Digitaluhr()
  {
    stunden = new Nummernanzeige(24);
    minuten = new Nummernanzeige(60);
  }
 
  /**
  * Setze die Uhrzeit auf die gegebene 'stunde' und 'minute'.
  */
  public void setzeUhrzeit(int stunde, int minute)
  {
    stunden.setzeWert(stunde);
    minuten.setzeWert(minute);
  }
 
 
  /**
  * Lässt die Uhr um eine Minute weiterlaufen
  */
  public void taktsignalGeben(){
    minuten.erhoehen();
    if(minuten.gibWert()==0){
      stunden.erhoehen();
    }
  }
 
  /**
  * Liefere die aktuelle Uhrzeit dieser Uhrenanzeige im Format SS:MM.
  */
  public void zeigeUhrzeit()
  {
    System.out.println(stunden.gibAnzeigewert() + ":" + minuten.gibAnzeigewert());
  }
}
Objekte erzeugen Objekte

Die Klasse „Digitaluhr“ hat unter anderem die folgenden beiden Datenfelder:

private Nummernanzeige minuten;
private Nummernanzeige stunden;

Hier wird der Klassenname Nummernanzeige wie eine (Daten-)Typangabe verwendet. Die Variablen minuten und stunden sind vom Objekttyp Nummernanzeige. Innerhalb des Konstruktors müssen nun die entsprechenden Objekte erzeugt werden. Dazu gibt es das Schlüsselwort new.

stunden = new Nummernanzeige(24);
minuten = new Nummernanzeige(60);

Die new-Anweisung macht zwei Dinge:

  • Sie erzeugt ein Objekt der angegebenen Klasse,
  • sie führt den Konstruktor dieser Klasse aus.

Wenn der Konstruktor der Klasse Parameter definiert, dann müssen aktuelle Parameter in der new-Anweisung angegeben werden. Die allgemeine Syntax der new-Anweisung lautet:

new Klassenname( Parameterliste )
Methodenaufrufe

Methoden können andere Methode der eigenen Klasse als Teil ihrer Implementierung aufrufen. Dies wird als interner Methodenaufruf bezeichnet.

Methoden können aber auch Methoden von anderen Objekten mit Hilfe des Punkt-Operators aufrufen. Dies wird als externer Methodenaufruf bezeichnet.

minuten.gibAnzeigewert();

Die Zeile bewirkt, dass die Methode gibAnzeigewert() des Minuten-Objekts aufgerufen wird. Die allgemeine Syntax lautet:

Objekt.Methodenname( Parameterliste ); 

Schülerbeiträge 2007/08

schule/if/ef/begr_oop.txt · Zuletzt geändert: 2018/05/31 17:52 von 127.0.0.1
CC Attribution-Noncommercial-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0