Java FH Merseburg SS 2002 1. Objektorientierung 1.1 Allgemeine Sicht auf Objekte Objektorientierung ist eine Problemlösungsstrategie, die im Wesentlichen auf den Konzepten Datenkapselung Vererbung und Polymorphie beruht. Sie wird zur Modellierung von Systemen eingesetzt, die dabei durch eine Menge von Objekten dargestellt werden. Diese Objekte interagieren miteinander. Kunde 6. 500 DM aushändigen Kassen automat - 4. 500 DM ausgeben 1. 500 DM abheben 2. 500 DM abbuchen Konto 5. 500 DM bereitstellen 3. Quittung Bankangestellter Die Vorteile dieser Strategie sind: das Verständnis für die Systeme wird einfacher Modifikationen und Erweiterungen sind einfach und häufig nur auf einige wenige Objekte beschränkt Ein Objekt ist eine Einheit aus Information und Dienstleistung. Es wird beschrieben durch Attribute (Zustand, Daten) und Operationen (Verhalten, Methoden). Die Attribute speichern die Auswirkungen der Operationen. Objekte entsprechen häufig Dingen aus der Realität. 582657400 -1- Java FH Merseburg SS 2002 Objekt Konto einzahlen() abrechnen() •Kontonummer •Saldo •Kunde überweisen() Das Objekt besitzt eine Identität, ein Verhalten, einen Zustand und Schnittstellen. Daten, und zugehörige Methoden werden gemeinsam entworfen, implementiert und gewartet. Objekt Bankangestellter abhebenGeld() beratenKunde() •Gehalt: 6.000 •Name: Schmidt •Alter: 38 •Termine .... vereinbarenTermine() Ein Objekt schützt seine Daten vor unerlaubtem Zugriff. Für die Außenwelt sind nur die Operationen sichtbar, und zwar nur ihre Aktivitäten, nicht aber die Art und Weise, wie sie agieren. 1.2 Klassen In objektorientierten Systemen sich Objekte identifizieren, die gleiche Attribute aufweisen und gleiches Verhalten, die sich nur in den konkreten Ausprägungen unterscheiden. 582657400 -2- Java FH Merseburg SS 2002 Objekte heißen gleichartig, wenn sie gleichen Aufbau und gleiches Verhalten haben. Gleichartige Objekte werden in einer zentralen Stelle, in Klassen beschrieben. Objekt 1 Objekt 2 Klasse Objekt 3 Eine Klasse ist eine Schablone (Bauplan), mit deren Hilfe Objekte mit gleichen Aspekten erzeugt werden können. Klassen verkörpern alle Funktionen einer bestimmten Objektmenge. Wenn man ein Programm in einer objektorientierten Sprache schreibt, definiert man Klassen. Beispielsweise kann man eine Klasse Tree definieren, die die Eigenschaften aller Bäume beschreibt (hat Äste und Wurzeln, wächst und gibt Sauerstoff ab). Die Klasse Tree dient als abstraktes Modell des Konzepts eines Baums. Sie stellt jedoch keinen bestimmten Baum dar, sondern einfach ein Modell zum Erzeugen von Baumobjekten. Um mit einem Baum programmtechnisch zu arbeiten, muß man ihn konkretisieren, d. h. eine konkrete Instanz dieses Baums erzeugen. Jede Bauminstanz kann unterschiedliche Eigenschaften haben (hat Blätter oder Nadeln, 582657400 -3- Java FH Merseburg SS 2002 blüht, trägt Früchte), während sie sich alle wie ein Baum verhalten und unmittelbar als solcher zu erkennen sind. Beim Erstellen der Klassen wird die eigentliche Programmierarbeit geleistet. class Bankangestellter Daten Gehalt: Name: Alter: Termine: Methoden beratenKunde() ... abhebenGeld(aBetrag) if aBetrag<>0 then send Konto abbuchen ... send Kassenautomat ... else... vereinbarenTermin() .... 582657400 -4- Java FH Merseburg SS 2002 Syntax: class Motorrad { String Marke; String Farbe; boolean Motorstatus; void start() { /* Methodenspezifikation } void Eigenschaften(){ /* Methodenspezifikation } public static void main (String args[]) { /* Methodenspezifikation } } 1.3 Programmtechnische Sicht auf Objekte und Instanzen In Java gehört jedes Objekt eindeutig zu einer Klasse. Um den Zusammenhang zu kennzeichnen, wird das Objekt als Instanz dieser Klasse bezeichnet. Eine (Klassen) Instanz ist ein eigentliches Objekt. Die Klasse ist die generische Darstellung eines Objekts, eine Instanz ist die konkrete Darstellung. Eine Klasseninstanz ist das eigentliche Objekt. Die Klasse ist die generische (Gattungs-) Darstellung eines Objekts, eine Instanz ist die konkrete Darstellung. Instanzen und Objekte stehen beide für die konkrete Darstellung einer Klasse. In der OOP-Terminologie werden Instanz und Objekt synonym verwendet. Klassen sind Strukturierungsmittel OO-Sprachen. Klassen bestehen aus zwei Teilen: Attribute bzw. Variablen, die den Zustand von Objekten dieser Klasse beschreiben und Methoden, die das Verhalten der Objekte festlegen. Klassen sind schachtelbar, da ihre Variablen vom Typ einer Klasse sein können. Mit einem Java-Programm werden in der Regel mehrere Klassen entworfen und implementiert. Wenn das Programm ausgeführt wird, werden nach Bedarf Instanzen dieser Klassen erzeugt und wieder verworfen. Motorrad m = new Motorrad(); 582657400 -5- Java FH Merseburg SS 2002 Für viele Probleme beinhaltet die Java-Umgebung eine Bibliothek mit Klassen, die einen Großteil des grundlegenden Verhaltens von Programmen implementieren, wie beispielsweise E/-Operationen, grafische und mathematische Funktionen, Arrays, Strings, Netzwerkoperationen usw.. Dies wird als Klassenbibliothek bezeichnet. Eine Klassenbibliothek ist eine Sammlung von Klassen. 1.4 Attribute Attribute sind die einzelnen Aspekte, die ein Objekt von einem anderen unterscheiden und sein Erscheinungsbild, seinen Status oder andere Eigenschaften festlegen. Beispiel: Attribute der Farbe Ausführung Marke hypothetischen Klasse PKW Rot, Grün, Silbermetallic .... Limousine, Kombi, Cabrio, Coupé ....... Honda, BMW, VW ...... Attribute werden durch Variablen definiert. Weil jede Instanz einer Klasse unterschiedliche Werte für ihre Variablen haben kann, werden diese auch als Instanzvariablen bezeichnet. Eine Instanzvariable definiert die Attribute eines Objekts. Die Klasse definiert den Typ der Attribute und jede Instanz speichert ihren eigenen Wert für dieses Attribut in der Instanzvariablen. Jedem Attribut ist eine Instanzvariable zugeordnet. Die Veränderung einer Variablen ändert auch das Attribut dieses Objekts. Instanzvariablen können gesetzt werden, wenn ein Objekt erzeugt wird, und die gesamte Lebensdauer des Objekts über konstant bleiben, sie können aber auch bei der Programmausführung jederzeit geändert werden. String Marke; String Farbe; boolean Motorstatus; Klassenvariablen entsprechen den globalen Variablen, die in allen Instanzen und in der Klasse selbst zur Verfügung stehen. Anders als Instanzvariablen, deren Werte in der Instanz abgelegt sind, werden die Werte der Klassenvariablen in der Klasse gespeichert. 1.5 Methoden 582657400 -6- Java FH Merseburg SS 2002 Die Methoden einer Klasse legen fest, was die Instanzen dieser Klasse tun, um ihren internen Status zu ändern, oder wie diese Instanz auf Nachrichten anderer Klassen oder Objekte reagiert. Verhaltensweisen definieren, wie eine Klasse oder ein Objekt mit dem restlichen Programm interagieren kann. Verhaltensweisen, die die PKW-Klasse haben könnten, sind etwa Motor starten(), Motor abstellen(), Gas geben(),oder Schalten(). Eine Methode ist ein Unterprogramm (Unterroutine, Funktion oder Prozedur), die innerhalb einer Klasse definiert ist, und die für Instanzen dieser Klasse ausgeführt wird. Methoden beziehen sich nicht immer auf ein einzelnes Objekt. Unter Verwendung von Methoden kommunizieren Objekte auch miteinander. Eine Klasse oder ein Objekt kann Methoden einer anderen Klasse oder eines anderen Objekts aufrufen, um Änderungen in der Umgebung mitzuteilen oder eine Statusänderung im Objekt anzufordern. void Eigenschaften() { System.out.println("Das Motorrad ist eine " + Marke + "Farbe: "+ color + "."); if (Motorstatus == true) System.out.println("Der Motor ist an."); else System.out.println("Der Motor ist aus."); } ... m.Eigenschaften(); Wie Instanzvariablen und Klassenvariablen gibt es auch Instanzmethoden und Klassenmethoden. Instanzmethoden (die in der Regel einfach nur als Methoden bezeichnet werden) beziehen sich auf eine Instanz einer Klasse. Klassenmethoden beziehen sich auf die Klasse selbst. 1.6 Nachrichten Das dynamische Verhalten von OO-Systemen wird durch das Versenden von Nachrichten beschrieben. Eine Nachricht stößt im Empfängerobjekt die Durchführung einer Operation an. Die Nachricht gibt lediglich an, welche Operation ausgeführt werden soll. Wie sie ausgeführt wird, liegt vollständig in der Verantwortung des Empfängerobjektes und ist nach außen nicht sichtbar. 582657400 -7- Java FH Merseburg SS 2002 Objekt Bankangestellter Objekt Kunde Botschaft Bankangestellter Empfänger abhebenGeld() Selektor 500,- Argumente Operationen und Daten werden als unteilbare Einheit betrachtet. Objekte schützen beide vor unerlaubtem Zugriff. Die Außenwelt sieht nur, welche Dienstleistungen (Methoden) angeboten werden. Wie sie erbracht werden ist im Objekt verborgen. Nur die eigenen Operationen eines Objektes können seinen eigenen Datenteil lesen und schreiben, Methoden aus anderen Objekten können die Daten nicht mehr lesen und verändern Datenkapselung. 1.7 Vererbung Verschiedene Klassen können Verhalten (Methoden) und Attribute (Variablen) gemeinsam haben. In diesem Fall bietet es sich an, diese Gemeinsamkeiten von einer zentralen Stelle aus zu verwalten. Oberklasse Unterklassen Vererbung ist ein Mechanismus, der es ermöglicht, dass eine neue Klasse ihre grundlegende Funktionalität von einer bereits existierenden Klasse erhält (erbt) und basierend darauf eine neue Funktionalität aufbaut. Eine Unterklasse erbt alle Methoden und Variablen von ihrer Oberklasse. Durch das Anlegen einer Unterklasse müssen Attribute oder Verhalten nicht neu definiert oder der Code aus der Oberklasse kopiert werden. Die Unterklasse erbt automatisch das Verhalten von der Oberklasse, die ihr Verhalten von ihrer Oberklasse erbt usw. in der Klassenhierarchie nach oben. 582657400 -8- Java FH Merseburg SS 2002 Dieses Prinzip ist aus der Klassifikation (z. B. Biologie) bekannt. Lebewesen Tiere Insekten Pflanzen Wirbeltiere Fische Säugetiere Katzen Pferde Durch die Vererbung wird eine Unterklasse zu einer Kombination aller in der Klassenhierarchie weiter oben liegenden Funktionen. class Bankangestellter Daten class Kreditberater extends Bankangestellter Daten Kreditlimit Methoden BewilligenKredit() ... Gehalt: Name: Alter: Termine: Methoden beratenKunde() ... abhebenGeld(aBetrag) ... vereinbarenTermin() .... Ganz oben in der Java-Klassenhierarchie befindet sich die Klasse Object, die allgemeinste Klasse der Hierarchie. Die Oberklasse Object definiert das Verhalten, das alle anderen Klassen in der Java-Klassenhierarchie erben. Jede Unterklasse 582657400 -9- Java FH Merseburg SS 2002 weiter unten in der Hierarchie fügt weitere Informationen ein und wird für eine ganz spezifische Aufgabe zugeschnitten. Insofern werden ganz oben in der Hierarchie sehr abstrakte Konzepte definiert werden, die auf dem Weg nach unten zu den Unterklassen immer konkreter werden. Die Unterklassenbildung beschreibt das Erzeugen einer neuen Klasse (der Unterklasse), die von einer anderen Klasse (ihrer Oberklasse) in der Klassenhierarchie erbt. Durch die Unterklassenbildung müssen nur noch die Unterschiede zwischen der neuen Unterklasse und ihrer Oberklasse zu definiert werden, alle anderen Verhaltensweisen und Attribute stehen der neuen Klasse durch die Vererbung zur Verfügung. Definiert eine Klasse ein völlig neues Verhalten und ist damit eigentlich keine Unterklasse einer bereits existierenden Klasse, erbt sie direkt von Object. Einer Klassendefinition, die ihre Oberklasse in der Deklaration nicht angibt, wird automatisch die Klasse Object als Standard-Oberklasse zugewiesen (z. B. Klasse Motorrad). Realisierungsprinzip der Vererbung Für Instanzvariablen wird beim Erzeugen einer neuen Klasseninstanz für alle in der aktuellen Klasse definierten Variablen sowie für alle in ihren Oberklassen definierten Variablen zur Laufzeit Speicher zugewiesen. Auf diese Weise bilden alle Klassen in ihrer Gesamtheit eine Schablone für das aktuelle Objekt und anschließend trägt jedes Objekt die Information ein, die für die jeweilige Situation angemessen ist. Methoden arbeiten ähnlich. Neue Objekte haben Zugriff auf alle Methoden ihrer Klasse und ihrer Oberklassen, aber die Methodendefinitionen werden dynamisch gewählt, wenn die Methode zur Laufzeit aufgerufen wird. Wenn also die Methode eines bestimmten Objekts aufgerufen wird, prüft der Java-Interpreter zuerst, ob die Methodendefinition in der Klasse dieses Objekts enthalten ist. Wenn dies nicht der Fall ist, sucht er in der Oberklasse des Objekts nach und gegebenenfalls in der Hierarchiekette nach oben, bis die Methode schließlich gefunden ist. Methode X Objekt 582657400 Methode X Objekt - 10 - Java FH Merseburg SS 2002 Vorteile der Vererbung: Diskussion auf verschiedenen Abstraktionsniveaus möglich Gemeinsamkeiten werden nur einmal beschrieben (Oberklasse) Änderungen sind damit auch nur einmal notwendig und sind dann direkt in allen Unterklassen wirksam Unterklasse kann neues Verhalten und neue Operationen hinzufügen und Ererbtes redefinieren Beispiele für Klassen aus der Java - Klassenbibliothek java.lang Klassen, die sich auf die Sprache selbst beziehen, u.a. Object, Math, String, System und Thread - außerdem Klassen für elementare Datentypen (int, char, boolean und andere). java.util Utility - Klassen wie etwa Date und Random sowie einfache Auflistungsklassen wie Vector oder Hashtable. java.io Eingabe- und Ausgabeklassen zum Lesen und Schreiben (wie Standardein- und ausgabe) und für die Verwaltung von Dateien. java.net Klassen für die Netzwerkunterstützung, u.a. Socket und URL java.awt (Abstract Window Toolkit) Klassen für die Implementierung einer grafischen Benutzeroberfläche, u.a. Window, Menu, Button, Font, CheckBox sowie die Bildverarbeitung. java.applet Klassen für die Implementierung von Java - Applets. Ist Unterklasse von java.awt und erbt somit auch dessen Funktionalität. Neben den Java - Klassen enthalten die IDE´s weitere Klassen, die andere Utilities oder Funktionalität bieten. Diese Klassen können praktisch sein, aber weil sie nicht Teil der Standard – Java - Bibliothek sind, stehen sie anderen Personen für die Ausführung der Java - Programme nicht unbedingt zur Verfügung. 1.8 Polymorphie Polymorphie (griech.: viele Formen) beschreibt die Möglichkeit, daß sich eine Methode in verschiedenen Klassen unterschiedlich verhalten kann. Verschiedene Unterklassen können eine Methode ihrer Oberklasse neu realisieren. Polymorphie ist bereits aus der prozeduralen Welt bekannt: die generischen Operatoren wie + oder – sind sowohl auf integer - als auch auf float – Werte anwendbar. (Operatoren sind im Grunde nichts anderes als Operationen mit besonderem Namen. Ein Aspekt der Polymorphie besteht folglich in der Variation der Schnittstelle gleichnamiger Operationen: 582657400 - 11 - Java FH Merseburg SS 2002 Class Uhrzeit { SetzeZeit (string z) {...} SetzeZeit (int h, int m, int s) {...} ... } ... Uhrzeit wecker = new Uhrzeit(); ... wecker.SetzeZeit(20, 0, 30); wecker.SetzeZeit(„20.00.30“); In diesem Beispiel existieren zwei gleichnamige Operationen, die sich nur in ihrer Signatur unterscheiden, d. h. mit anderen Parametern aufgerufen werden. Die Signatur einer Methode ermöglicht, diese genau zu identifizieren. Die Signatur besteht aus dem Namen der Methode, der Anzahl ihrer Argumente sowie dem Typ der einzelnen Argumente. Definiert eine Unterklasse eine Methode mit derselben Signatur wie in einer Oberklasse, wird die Methodendefinition verwendet, die zuerst gefunden wird (beginnend bei der Klasse des Objekts in der Hierarchie nach oben). Die Methode der Unterklasse überschreibt die Methode der Oberklasse. Dies nennt man auch statische Polymorphie. Ausgangspunkt der dynamischen Polymorphie ist das Versenden einer Nachricht (Aufruf einer Methode) an ein anderes Objekt. Je nach Zugehörigkeit zu einer Klasse kann das Objekt unterschiedlich reagieren. Dies wird durch die sogenannte späte Bindung realisiert, bei der der genaue Speicherort einer Operation erst dann ermittelt wird, wenn der Aufruf stattfindet, d. h. eine entsprechende Nachricht an das Objekt gesendet wird. Beispiel: class GeoFigur { double flaeche() {return 0.0 ; } ... } Die eigentlichen Formen für Quadrat, Rechteck und Kreis werden als Unterklasse von GeoFigur abgeleitet. Jede dieser Klasse überschreibt die Methoden von GeoFigur mit der für sie nötigen Funktionen. class Quadrat extends GeoFigur { int a; double flaeche() {return a * a ; } ... } class Rechteck extends GeoFigur { int a, b; double flaeche() {return a * b ; } ... } class Kreis extends GeoFigur { double radius; double flaeche() {return 2*Math.PI * radius * radius ; } 582657400 - 12 - Java FH Merseburg SS 2002 ... } Programmcode ist nicht mit Fallunterscheidung realisiert, sondern auf übersichtliche kleine Klassen aufgeteilt. Als Unterklassen von GeoFigur können Instanzen der drei Klassen ohne Probleme einer Variablen von GeoFigur zugewiesen werden: GeoFigur gf1, gf2, gf3; und neue Instanzen erzeugt werden gf1 = new Quadrat (20); gf2 = new Rechteck (20, 30); gf3 = new Kreis (20); Ein Aufruf der Methode flaeche() von GeoFigur auf einem beliebigen der Objekte wird automatisch die korrekte Methode der jeweiligen Klasse ausgewählt: double d = gf1.flaeche() double e = gf2.flaeche() double f = gf3.flaeche() // 400 // 600 // 2*pi*400 So wird z. B. beim Aufruf von gf3.flaeche() automatisch die entsprechende Methode der Klasse Kreis ausgeführt, da der variablen gf3 ein Objekt der Klasse Kreis zugewiesen wurde. Polymorphie liefert also bei Aufruf einer Methode wie flaeche() in Abhängigkeit von der konkreten Realisierung dieser Methode in der jeweiligen Unterklasse ganz unterschiedliche und automatisch die richtigen Resultate. 582657400 - 13 - Java 1.9 FH Merseburg SS 2002 Beziehungen zwischen Objekten und Klassen Vererbungsbeziehungen Durch Vererbungsbeziehungen werden Generalisierung bzw. Spezialisierung beschrieben. Eine Oberklasse ist eine Generalisierung ihrer Unterklasse. Eine Unterklasse ist eine Spezialisierung ihrer Oberklasse. Assoziationen Assoziationen beschreiben dauerhafte Beziehungen zwischen Objekten verschiedener Klassen. Assoziationen werden auch als „Benutzt – Beziehungen“ bezeichnet. Ein Beispiel ist die Beziehung zwischen einem Objekt Firma und einem Objekt Mitarbeiter. class Filiale sichert Schutzobjekt class Wachdienst Wächter reinigt class Putzmann Aggregationen Aggregationen beschreiben ebenfalls dauerhafte Beziehungen zwischen Objekten verschiedener Klassen, im Unterschied zu Assoziationen aber in einer Beziehung wie ein Ganzes zu seinen Teilen. Aggregationen werden auch als „Ganzes – Teil – Beziehungen“ bezeichnet (besondere Variante der Assoziation). Auto – Motor, Lenkrad, Räder etc. Unternehmen – Abteilung – Mitarbeiter etc. Komposition Besondere Art der Aggregation: Einzelteile sind vom Aggregat existenzabhängig. Beispiel: Rechnungsposition von der Rechnung Nachrichtenbeziehungen Die Kommunikation der Objekte geschieht über den Austausch von Nachrichten. Die Objekte senden sich untereinander Nachrichten zu, die zu den Operationen (Methoden) führen. Ein Objekt versteht genau die Nachrichten, zu denen es Operationen besitzt. 582657400 - 14 - Java FH Merseburg SS 2002 Beispiel: Es existieren Klassen Rechteck mit setA() und setB() und Kreis mit setRadius(), beide abgeleitet von GeoFigur. Beziehungen von Kreiseck zu Klassen Rechteck und Kreis werden nun betrachtet: class KreisEck extends GeoFigur { Kreis k; Rechteck r; public void anzeigen() { k.anzeigen(); r.anzeigen(); } ... public void setA (int neuA) { k.setRadius(neuA/2); r.setA(neuA); r.setB(neuA); } .... public void vergroessern(float faktor) { int a; a = r.getA(); setA(a * faktor); } Das Objekt KreisEck erzeugt innerhalb der Methode vergroessern() eine Nachricht an sich selbst (setA()), die wiederum weitere Nachrichten an Kreis und Rechteck erzeugt. Nachrichten in OO - Programmen unterscheiden sich von Funktionsaufrufen in prozeduralen Sprachen durch: Daten und Methoden bilden eine Einheit – Methoden / Nachrichten lassen sich nur über das Objekt ansprechen. Objektattribut sind gekapselt und nach außen nur über Methoden des Objektes zugänglich Eine Nachricht kann von einem Objekt nur interpretiert werden, wenn es dazu eine passende Methode besitzt *** 582657400 - 15 -