Kapitel 2: OO Grundlagen

Ähnliche Dokumente
Programmierung Nachklausurtutorium

Programmieren in Java

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

12 Abstrakte Klassen, finale Klassen und Interfaces

Objekte und Klassen. INE2 M. Thaler, Office TG ZHAW, M. Thaler, K. Rege, G. Burkert, E.

Algorithmen und Datenstrukturen 07

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java

Institut für Programmierung und Reaktive Systeme. Java 7. Markus Reschke

Vorkurs Informatik WiSe 15/16

Algorithmen und Datenstrukturen

Programmieren in Java

Vererbung. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 23.5.

Vererbung, Polymorphie

14 Abstrakte Klassen, finale Klassen, Interfaces

14 Abstrakte Klassen, finale Klassen, Interfaces. Auswertung von Ausdrücken. Beispiel. Abstrakte Methoden und Klassen

14 Abstrakte Klassen, finale Klassen, Interfaces

Einführung in die Programmiersprache Java II

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)

Vererbung P rogram m ieren 2 F örster/r iedham m er K apitel 11: V ererbung 1

Institut für Programmierung und Reaktive Systeme. Java 6. Markus Reschke

Anwendungsentwicklung mit Java. Grundlagen der OOP, Vererbung, Schnittstellen, Polymorphie

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Einführung in die Programmiersprache Java II

Vererbung P rogram m ieren 2 F örster/r iedham m er K apitel 11: V ererbung 1

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Wiederholung: Gerüstbeispiel. Vererbungshierarchie: Typ 0

Programmieren II. Innere Klassen. Heusch 10, Ratz 5.2.1, Institut für Angewandte Informatik

Info B VL 11: Innere Klassen/Collections

Einführung in die Programmierung

Propädeutikum Programmierung in der Bioinformatik

7. Objektorientierung. Informatik II für Verkehrsingenieure

Objektorientierte Programmierung Studiengang Medieninformatik

1 Klassen und Objekte

1 Abstrakte Klassen, finale Klassen und Interfaces

Einführung in die Programmierung

Tag 8 Repetitorium Informatik (Java)

Javakurs für Anfänger

Was du ererbt von Deinen Vätern hast, erwirb es, um es zu besitzen. J. W. v. Goethe.

Praxis der Programmierung

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

Vererbung, Polymorphismus

Programmieren 1 09 Vererbung und Polymorphie

Inhaltsverzeichnis. Grundlagen und Einführung (1. Band) 1

Objektorientierte Programmierung. Kapitel 14: Interfaces

Die abstrakte Klasse Expression:

Repetitorium Informatik (Java)

Silke Trißl Wissensmanagement in der Bioinformatik. Objektorientierte Programmierung (OOP) Vorstellung wie in der realen Welt: Farbe Hubraum Tank...

Programmieren II. Abstrakte Klassen, Interfaces Heusch 13.8, 13.9 Ratz Institut für Angewandte Informatik

Programmieren II. Abstrakte Klassen, Interfaces Heusch 13.8, 13.9 Ratz Institut für Angewandte Informatik

Grundelemente objektorientierter Sprachen (1)

Vorlesung Programmieren. Bisher: Klassen und Objekte. Was ist mit ähnlichen Klassen? Vererbung und Polymorphismus

Objektorientierte Programmierung

Objektorientierte Programmierung III

Programmieren 2 Java Überblick

JAVA 05: Objektorientierte Konzepte

Programmiertechnik Klassenvariablen & Instantiierung

Geschachtelte Klassen

Innere Klassen. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java

Javakurs für Anfänger

Beispiele für Ausdrücke. Der imperative Kern. Der imperative Kern. Imperativer Kern - Kontrollstrukturen. Deklarationen mit Initialisierung

Klassen und ihre Beziehungen III: Mehrfache Vererbung, Rollen, Schnittstellen und Pakete

Objektorientierte Programmierung Studiengang Medieninformatik

Arten von Klassen-Beziehungen

Vererbung. Martin Wirsing. Ziele. Vererbung

IT I: Heute. abstrakte Methoden und Klassen. Interfaces. Interfaces List, Set und Collection IT I - VO 7 1

Universität Stuttgart Institut für Automatisierungstechnik und Softwaresysteme Prof. Dr.-Ing. M. Weyrich

Objektorientierte Programmierung Studiengang Medieninformatik

Teil 2: Weitere Aspekte der Objektorientierung

Einstieg in die Informatik mit Java

Methoden und Klassen. Silke Trißl Wissensmanagement in der Bioinformatik

Durch die Teil-von-Beziehung soll ausgedrückt werden, dass ein Objekt A als (physikalischer) Teil eines Objekts B angesehen wird. Insbesondere kann ei

Vererbung. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 14.1.

Javakurs für Anfänger

Javakurs für Anfänger

Prof. Dr. Wolfgang Schramm. Vorlesung. Techniken der Programmentwicklung. Exkurs: Anonyme Klassen

Vorlesung Datenstrukturen

Javakurs für Anfänger

Programmieren I. Kapitel 10. Spezielle Features

Vorlesung Datenstrukturen

Einführung in die Programmierung für NF MI. Übung 07

Tag 7 Repetitorium Informatik (Java)

Programmiertechnik Objektorientierung

Javakurs für Anfänger

7. Schnittstellen Grundlagen zu Schnittstellen. 7. Schnittstellen

Grundelemente objektorientierter Sprachen (1)

Weitere Beispiele. Beispiel CD-Spieler: Exemplare eines abstrakten Konzepts. 7. Schnittstellen. Schnittstelle: Syntax

Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer. Programmiertechnik Objektorientierung

UNIVERSITÄT SIEGEN Fachbereich 12, Elektrotechnik und Informatik Fachgruppe Betriebssysteme / verteilte Systeme

Klassen und ihre Beziehungen II: Einfache Vererbung und Abhängigkeit

Grundelemente objektorientierter Sprachen (1)

Klassenvariablen und statische Methoden

Schlussendlich geben wir die Listen aus. Es kommt zu folgender Ausgabe:

Einstieg in die Informatik mit Java

Silke Trißl, Prof. Ulf Leser Wissensmanagement in der Bioinformatik. Jede Applikation braucht eine Klasse mit einer main-methode

Transkript:

Kapitel 2: OO Grundlagen 2.1 Objekte zum Leben erwecken (und Grundmechanismen verstehen) 2.2 Statische Elemente nutzen & vererben 2.3 Kooperation über Interfaces Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektoiertierte Programmierung K2-1

Das laufende Beispiel: verschiedene Zettel Ein Zettel hat ähnlich einer Karteikarte eine Überschrift (kurz: Titel ) und einen Inhalt. Im einfachsten Fall sind Titel und Inhalt beides Zeichenreihen. Zettel kann man zählen und mit Seriennummern veredeln. Dann ähneln sie Banknoten oder Reisepässen. Auf Zettel kann man Eintragungen vornehmen, überschreiben, wieder rückgängig machen, erneut beschreiben... Die Programme dieses Kapitels demonstrieren anhand dieser Anwendungsbeispiele die wichtigsten OO Konzepte. Da praktisch weder Kontrollstrukturen noch Datenstrukturen vorkommen, zeigen die Beispiele ausschließlich OO Elemente und ihre Verwendungsmöglichkeiten. Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektoiertierte Programmierung K2-2

2.1 Objekte zum Leben erwecken Aus Gründen der Beschreibungsökonomie modelliert man nicht einzelne Objekte, sondern Objektarten, d.h. Klassen von Objekten. Zu modellieren sind dabei: der Zustand durch geeignete Exemplarvariablen ( Attribute ), die in der Regel privat, d.h. von aussen unsichtbar sind; mindestens eine Konstruktormethode zum Erschaffen und Initialisieren von Objekten der Klasse; öffentliche ( public ) getter - und setter -Methoden zum Zugriff auf die Attribute, soweit freizugeben; eine tostring() -Methode, mit der für Testzwecke der Inhalt des Objekts in lesbarer Form dargestellt werden kann; als Rest des Protokolls ggfs weitere, klassenspezifische Methoden. Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektoiertierte Programmierung K2-3

Die Zettel-Klasse in UML und Java Zettel-Objekte haben konkret einen Titel und einen Inhalt (hier Zeichenketten) einen Konstruktor, der einen Zettel mit gegebenem Titel und Inhalt herstellt getter und setter für den Inhalt (der Titel ist damit von außen nicht zu verändern) eine tostring() -Methode Zettel - titel : String - inhalt : String + Zettel(String,String) + getinhalt() : String + setinhalt(string) : void Zwei Exemplarvariablen Ein Konstruktor Zugriff auf Inhalt mit getter / setter tostring() -Methode zur Darstellung Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektoiertierte Programmierung K2-4

Programme ausführen: die main() -Methode Eine Klasse ausführen heißt immer: ihre main()-methode starten. Die main()-methode hat immer den gleichen Rahmen: public static void main(string[] args) { }... Zur Übernahme von Kommandozeilenparametern Die main()-methode kann in einer eigenen Testklasse stehen oder auch in der zu testenden (bzw. auszuführenden) Klasse. Die main()-methode erzeugt Testobjekte per Konstruktoraufruf: Zettel meiner = new Zettel("z","z-Inhalt") Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektoiertierte Programmierung K2-5

Java: Variablen, Objekte und Parameter Variablen enthalten entweder elementare Werte (int, char, boolean o.ä.) oder Objekt-Referenzen (vgl. Ada "access types"), aber niemals Objekte selbst!! Parameter werden stets "per value" übergeben: beim Aufruf werden die in den aktuellen Parametern vorliegenden Referenzen in die formalen Parameter (Variablen) kopiert; am Ende des Methodenaufrufs werden die formalen Parameter gelöscht (also nicht zurückgegeben!!); die Inhalte eines Parameterobjekts / Methodenempfängers können verändert werden, nicht aber seine Identität (der Referenz-Wert)! Die Pseudovariable this bezeichnet den Methodenempfänger. Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektoiertierte Programmierung K2-6

Java: Object, Casts und Clones "Object" heißt die Wurzelklasse der Vererbungshierarchie. => Jedes Objekt ist ein spezielles Object-Exemplar. Variablen vom Typ Object können beliebige Objekt-Referenzen aufnehmen. Bei einer Wertzuweisung werden nur die Referenzen kopiert. => Es entstehen keine echten Kopien, sondern nur mehrfache Referenzen auf das selbe Objekt! Um echte Kopien zu erstellen, redefiniert man die Methode public Object clone() aus Object geeignet und "castet" das Ergebnis passend: (Zettel)z.clone() Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektoiertierte Programmierung K2-7

2.2 Statische Elemente nutzen & vererben Es gibt zweierlei statische Elemente: analog zu den Exemplarvariablen, die spezifisch für Objekte sind, die Klassenvariablen von Klassen; Klassenmethoden wie main(), die sich auf die Klasse, d.h. den Prägestempel selbst beziehen. Normale Methoden haben Zugriff auf die Parameter der Methode; lokal (in der Methode) deklarierte Hilfsvariablen; die Klassenvariablen der Klasse des Empfänger-Objekts; die Exemplarvariablen des Empfänger-Objekts. Eine Klassenmethode hat als Empfänger die Klasse, kein Objekt. Zugriff auf Exemplarvariablen kann es daher nicht geben! Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektoiertierte Programmierung K2-8

Gezählte Zettel Als Zähler wird eine mit 0 initialisierte Klassenvariable verwendet: static int zaehler = 0 deren getter dementsprechend eine Klassenmethode ist: public static int getzaehler() Die Klasse Gezaehlt ist Unterklasse von Zettel. Gezaehlt hat zwei überladene Konstruktoren, wobei der mit einem Parameter sich per this(...) auf den anderen stützt. Der andere Konstruktor stützt sich seinerseits per super(...) auf den Konstruktor der Oberklasse Zettel. Die Methoden clone() und tostring() werden geeignet redefiniert. Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektoiertierte Programmierung K2-9

Nummerierte Zettel Der Zählerwert wird bei Initialisierung im Konstruktor aus der ererbten Klassenvariablen zaehler in eine Exemplarvariable nummer übernommen, die von da an unverändert bleibt, aber per getter erreichbar ist: public static int getnummer() Die Klasse Nummeriert ist Unterklasse von Gezaehlt. Nummeriert hat zwei überladene Konstruktoren, wobei der mit einem Parameter sich per this(...) auf den anderen stützt. Der andere Konstruktor stützt sich seinerseits per super(...) auf den Konstruktor der Oberklasse Gezaehlt. Die Methoden clone() und tostring() werden geeignet redefiniert. Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektoiertierte Programmierung K2-10

Nutzanwendung Parkausweis Die Klasse Parkausweis ist Unterklasse von Nummeriert. Parkausweis hat eine Exemplarvariable kennzeichen Parkausweis hat zwei überladene Konstruktoren, wobei der mit einem Parameter sich per this(...) auf den anderen stützt. Der andere Konstruktor stützt sich seinerseits per super(...) auf den Konstruktor der Oberklasse Nummeriert. Die Methoden clone() und tostring() werden geeignet redefiniert. Eine Feinheit: Damit tostring() in der gezeigten Weise auf die ererbte Exemplarvariable titel zugreifen kann, muß diese in Zettel als protected, d.h. als in Unterklassen zugreifbar deklariert werden. Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektoiertierte Programmierung K2-11

Entstandene Klassenhierachie Zettel # titel : String - inhalt : Object + getinhalt() : Object + setinhalt(object) : void Gezaehlt - zaehler : int + getzaehler(): int + clone() : Object Legende: + public - private # protected Nummeriert - nummer : int + getnummer(): int + clone() : Object Konstruktoren sind hier nicht explizit dargestellt! Parkausweis - kennzeichen: String + clone() : Object Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektoiertierte Programmierung K2-12

2.3 Kooperation über Interfaces Neue Aufgabe: Eintragungen wieder rückgängig machen; zunächst einen Schritt ( Undo/Redo ), später beliebig viele Schritte. Die Aufgabe wird auf mehrere Schultern verteilt. Dazu Trennung von Zettel und seiner Info. Alles, was den Inhalt betrifft, delegiert Zettel an Info: Ein Zettel, der aufgefordert wird, etwas an seinem Inhalt zu tun, leitet die Aufgabe an seinen Partner Info weiter. Wichtig ist nicht, wer der Partner ist, sondern was er kann. Das beschreibt das Interface InfoInterface. Zettelpartner implementieren dieses Interface. Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektoiertierte Programmierung K2-13

Delegation in UML Zettel - titel : String # info : InfoInterface + getinhalt() : Object + setinhalt(object) : void «interface» InfoInterface + getinhalt() : Object + setinhalt(object) : void enthält -Beziehung, hier als Komposition sonst meist Aggregation Delegation u.a. Zettel.getInhalt() => Zettel.info.getInhalt() Partner info leistet die Arbeit Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektoiertierte Programmierung K2-14

Info-Anpassungen (Implementierung) Vererbungs -Beziehung zwischen Interfaces «interface» InfoInterface + getinhalt() : Object + setinhalt(object) : void «interface» RueckInterface + undo() : void implementiert - Beziehung von Klasse zu Interface EinfacheInfo - inhalt : Object + getinhalt() : Object + setinhalt(object) : void SimpleRueckInfo - aktinhalt : Object - voriger : Object + getinhalt() : Object + setinhalt(object) : void + undo() : void MultiRueckInfo - aktinhalt : Object - voriger : MultiRueckInfo + getinhalt() : Object + setinhalt(object) : void + undo() : void Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektoiertierte Programmierung K2-15

Zettel-Anpassungen (Reimplementierung) Zettel - titel : String # info : InfoInterface + getinhalt() : Object + setinhalt(object) : void Vererbungs - Beziehung EinfacherZettel SimpleRueckZettel MultiRueckZettel + undo() : void + undo() : void Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektoiertierte Programmierung K2-16

Zusammenfassung: UML-Elemente <objektname> : <Klasse> <attribute> : <werte> Exemplar / Instanz von <zugriff> : + public - private # protected <Klasse> <attribute> <methoden> <Klasse> : konkret oder abstrakt <attribute> : <zugriff> <name> : <typ> <methoden> : <zugriff> <name> (<parameter>) : <typ> konkret oder abstrakt enthält Unterklasse von i.d.r. Klasse oder Interface <Klasse> <attribute> <methoden> implementiert «interface» <Name> <abstrakte Methoden> Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektoiertierte Programmierung K2-17

Mehrfachvererbung In Analysemodellen treten oft unabhängige Dimensionen der Spezialisierung auf (Mehrfachvererbung). Termin persönl. Termin Hausveranstaltung Reise Teamveranstaltung Teambesprechung Vortrag In Entwurfsmodellen sollten Mehrfachvererbung beseitigt werden. Techniken dazu sind: Ersatz von Vererbung durch Komposition Definition von Schnittstellen Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektoiertierte Programmierung K2-18

Ersatz von Vererbung durch Komposition Termin Teamveranstaltung 1 1 Team- Ort- Rolle Rolle persönl. Termin Hausveranstaltung Reise Teambesprechung nun wie realisiert? Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektoiertierte Programmierung K2-19

Ersatz von Vererbung durch Schnittstellen Guter Software-Entwurf sichert Homogenität. Gleichartige Funktionalität soll in gleicher Weise aufrufbar sein. Schnittstelle (interface) ist ein Sprachkonstrukt von UML und Java. Termin <<interface>> Hausveranstaltung einladen() absagen() implementiert Teambesprechung einladen() absagen() Vortrag einladen() absagen() Lollipop -Notation: Teambesprechung Hausveranstaltung Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektoiertierte Programmierung K2-20

Schnittstellen und abstrakte Klassen Abstrakte Klasse Schnittstelle ( Interface ) Enthält Attribute und Operationen Kann Default-Verhalten festlegen Default-Verhalten kann in Unterklassen überdefiniert werden Enthält nur Operationen (und ggf. Konstante) Kann kein Default-Verhalten festlegen => Redefinition unmöglich Java: Unterklasse kann nur von einer Klasse erben Java: Eine Klasse kann mehrere Schnittstellen implementieren Schnittstelle ist eine spezielle Sicht auf eine Klasse Lothar Schmitz UniBwM (teils nach Prof. Hußmann TUD) Objektoiertierte Programmierung K2-21