DIE WICHTIGSTEN STICHWORTE UND FAKTEN ZUM THEMA "OBJEKT-ORIENTIERTE PROGRAMMIERSPRACHEN" UND OO IN JAVA

1. OBJEKTE

1.1 Objekte werden durch ZUSTAND und VERHALTEN beschrieben Die Zustandskomponenten heissen ATTRIBUTE, das Verhalten wird durch Methoden (oder synonym: Operationen) spezifiziert. Der Internzustand sowie bestimmte Operationen, die nur innerhalb Objektes benötigt werden, können nach dem GEHEIMNISPRINZIP (Information Hiding) vor externem Zugriff geschützt werden. Die möglichen Verhaltensweisen eines Objektes werden durch das Versenden von BOTSCHAFTEN an das Objekt ausgelöst. Während bei der nicht objekt-orientierten imperativen Programmierung Daten an eine Funktion zur Verarbeitung übergeben werden, kapselt das Objekt Daten und auf ihnen anwendbare Funktionen; die Verarbeitung der Daten wird durch Senden einer Botschaft an das Objekt ausgelöst. Die Parameter der Botschaft dürfen wiederum Objekte sein, d.h. intuitiv gesprochen, man kann mit den Eingangsdaten einer Botschaft auch gleich die Methoden zur Verarbeitung dieser Eingangsdaten mitsenden.
[Literatur: Balzert, Abschnitt 2.5]

1.2 Methoden (Operationen) lassen sich in Prozedur/Funktion/Konstruktor gliedern. Prozeduren sind void-Methoden, Konstruktoren sind spezielle Prozeduren, die nur bei der Objekterzeugung aufgerufen werden dürfen. Funktionen sind Methoden, die einen Rückgabewert erzeugen. Die Objektinitialisierung geschieht durch KONSTRUKTOREN (Operationen zur Erzeugung/Initialisierung von Objekten) In Java:

Methoden haben eine SIGNATUR, diese ist definiert durch Methoden können ÜBERLADEN (engl. OVERLOADING) werden: Hierunter versteht man die mehrfache Deklaration der Methode mit unterschiedlichen Signaturen.
[Literatur: Balzert, Abschnitt 2.11 und pp. 258-259] In Java:

2. KLASSEN

Klassen spezifizieren die Gemeinsamkeiten einer Menge von Objekten mit denselben Eigenschaften (Attributen) und demselben Verhalten (Methoden) und denselben Beziehungen (d.h. Vererbungsstrukturen und Assoziationen, siehe Vererbung weiter unten). ABSTRAKTE KLASSEN definieren nicht alle erforderlichen Methoden für ihre Objekte, sondern nur Methodenschnittstellen. Sind Klassen nicht abstrakt, bieten sie insbesondere Methoden zur Objekterzeugung an (Konstruktoren). Die Klasse dient dann als "Objektfabrik" OBJECT FACTORY. Durch die Klasse erzeugte Objekte heissen INSTANZEN der Klasse. In Java: Die Attribute und Methoden einer Klasse werden gmeinsam als MITGLIEDER (engl. members) der Klasse bezeichnet. Klassen können VERERBT werden: Eine Klasse (dann Unterklasse genannt) kann die Attribute und Methoden einer oder mehrerer Oberklassen übernehmen und dann eigene Attribute und Methoden hinzudefinieren. Ein Objekt O der Unterklasse K2 ist damit auch ein Mitglied einer jeden Oberklasse K1: Bei Methodenaufrufen, die Parameter vom Typ K1 verlangen, darf also O als gültiger Wert verwendet werden. O besitzt als Instanz von K2 spezielle Eigenschaften, die in K1 nicht enthalten sind. Daher wird K2 als SPEZIALISIERUNG von K1 bezeichnet; umgekehrt ist K1 eine GENERALISIERUNG von K2. Dabei dürfen in Oberklassen vorhandene Methoden von der Unterklasse Damit können Objektinstanzen unterschiedlicher Klassen Methoden mit identischer Signatur oder gleichen Namens besitzen, die unterschiedliches Verhalten implementieren. Diese Eigenschaft objekt-orientierter Programmiersprachen wird POLYMORPHISMUS genannt. Wird ein Objekt O als Parameter einer Methode vom Typ K1 eingegeben, ist damit nicht immer zur Übersetzungszeit bereis bekannt, ob zur Laufzeit auch ein Objekt der Unterklasse K2 als Parameter verwendet wird. Infolgedessen ist erste zur Laufzeit bekannt, ob beim Aufruf O.m() die Methode m() der Klasse K1 oder die in K2 redefinierte Methode m() zur Ausführung kommt. Dies muss von der Laufzeitumgebung ermittelt werden (DYNAMSCHES BINDEN).
[Literatur: Balzert, Abschnitt 2.10, 2.14] In Java:

3. TYPEN

Während Klassen typischerweise Zustand und Verhalten zumindest teilweise explizit definieren, benötigt man auch ein Konzept, mit dem man Leistungen gewünschter (später explizit auszuprägender) Objekte IMPLIZIT spezifizieren kann, d.h., ohne Zustandskomponenten und Methodenrümpfe explizit zu benennen. Allgemein besteht eine implizite Spezifikation aus Formale Sprachen (z.B. VDM, Z, CSP und verschiedene algebraische Spezifikationsformalismen) bieten in der Regel die Möglichkeit zur impliziten Spezifikation mit Schnittstellenspezifikation und Axiomen. Dagegen bestehen implizite Spezifikation bei Programmiersprachen in der Regel allein aus der Schnittstellenspezifikation; die Definition logischer Prädikate wird nicht als Sprachbestandteil angesehen. Beispiele für implizite Spezifikation bei Programmiersprachen: In Java: Vereinfacht ausgedrückt: In Java sind interfaces reine Entwurfsspezifikationen, während Klassen Mischungen aus Entwurfsspezifikation und Implementierung sind.
[Literatur: Balzert, Abschnitt 2.16]

Manche Programmiersprachen lassen das "Programmieren mit Typen" zu, d.h. sie bieten Methoden zur Abfrage von Eigenschaften eines Objekttyps an. In C-Code kann man beispielsweise nicht abfragen, welchen Funktionsnamen die aktuell ausgeführte C-Function hat. Es gibt auch keine C-Operationen, mit denen man die Namen und Signaturen der in einer C-Bibliothek enthaltenen Funktionen abfragen kann.

Dagegen in Java:

4. GENERISCHE FUNKTIONEN UND KLASSEN

Die Eigenschaft generisch bedeutet 'Typunabhängigkeit'. Mit diesem Begriff ist die Möglichkeit gemeint, bei der Instantiierung eines Objektes aus einer Klasse auch parametrisierbare Typen (in C++ Templates genannt) in den Methodenschnittstellen festzulegen und bei Methodenaufrufen auch anzuwendende Verarbeitungsfunktionen als Parameter mitzugeben.

In Java:
Templates und Funktionsparameter sind nicht als explizite Sprachkonstrukte vorhanden, aber auch nicht erforderlich, da die baumartige Vererbungshierarchie immer Object als allgemeinsten Verarbeitungstyp kennt.


Jan Peleska - TZI - Bremen Institute of Safe Systems BISS / < jp@informatik.uni-bremen.de> / 29 MAY 2001