Vererbungskonzepte in Java

Slides:



Advertisements
Ähnliche Präsentationen
der Universität Oldenburg
Advertisements

Objektorientierte Programmierung
Kritische Betrachtung
der Universität Oldenburg
Christos, Kornelia, Jan Christos, Kornelia, Jan Entwicklungsumgebung Versteht unseren Java Programm Code Versteht unseren Java Programm.
Abstrakte Klassen HS Merseburg (FH) WS 06/07.
Ausnahmen HS Merseburg (FH) WS 06/07.
Java: Objektorientierte Programmierung
Java: Dynamische Datentypen
Java: Grundlagen der Objektorientierung
Vererbung.
Ein Beispiel in Java.
Erweiterte Zuweisungskompatibilität
Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,
Konstruktoren.
Polymorphie (Vielgestaltigkeit)
Polymorphie (Vielgestaltigkeit)
Interface bzw. Schnittstelle anschaulich: Hüllenklasse
Dynamischer Speicher. In einer Funktion wird z.B. mit der Deklaration int i; Speicher auf dem sogenannten Stack reserviert. Wenn die Funktion verlassen.
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Listen-
Programmieren mit JAVA
Programmieren mit JAVA
Vererbung Spezialisierung von Klassen in JAVA möglich durch
PKJ 2005/1 Stefan Dissmann Zusammenfassung Bisher im Kurs erarbeitete Konzepte(1): Umgang mit einfachen Datentypen Umgang mit Feldern Umgang mit Referenzen.
Die Skriptsprache Perl (8) Wolfgang Friebel DESY Zeuthen.
07-GraphischeObjekte Graphische Objekte in EMMA301Paint.
DVG Klassen und Objekte
Einführung in die Programmierung Vererbung
Objektorientiertes Programmieren
CuP - Java Elfte Vorlesung Montag, 11. November 2002.
EPROG Tutorium Einheit 4 Klassen und Objekte. Wiederholung Schleifen do... while while for break/continue Strings String char Methoden für Strings Arrays.
Copyright 2011 Bernd Brügge, Christian Herzog Grundlagen der Programmierung TUM Wintersemester 2011/12 Kapitel 11, Folie 1 2 Dr. Christian Herzog Technische.
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
OOP-Begriffe Abstraktion Modellieren Klasse Objekt Attribute Methoden
ObjektOrientiertes Programmieren
Objektorientierte Programmierung
EPROG Tutorium #6 Philipp Effenberger
EPROG Tutorium #5 Philipp Effenberger
EPROG Tutorium #3 Philipp Effenberger
Polymorphie (Vielgestaltigkeit). Wenn eine Methode, wie z.B. print für verschiedene Programmteile steht (und z.B. einmal Objekte verschiedener Klassen.
OOP-Begriffe Abstraktion Modellieren Klasse Objekt Attribute Methoden
Vererbung Prof. Dr. Christian Böhm in Zusammenarbeit mit Gefei Zhang
Einführung in die Programmierung mit Java
Java-Kurs Übung Besprechung der Hausaufgabe
Java-Kurs - 5. Übung Besprechung der Übungsaufgabe Klassen und Objekte
Einführung in die Programmierung mit Java
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer, Dr. Thomas H. Kolbe Einführung in die Programmierung mit Java 7. Vorlesung WS 2002/2003.
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer, Dr. Thomas H. Kolbe Einführung in die Programmierung mit Java 9. Vorlesung WS 2001/2002.
Java-Kurs - 9. Übung Besprechung der Hausaufgabe
Abstrakte Klassen und das Interface-Konzept
Objektorientierte Programmierung (OOP)
Diskrete Mathe Diskrete Mathematik I Listen Vorlesung 4.
Vererbung. Klassen - Vererbung  Eine Klasse kann von einer Basisklasse abgeleitet werden  Die abgeleitete Klasse erbt die Eigenschaften und Methoden.
Tutorium Software-Engineering SS14 Florian Manghofer.
Objektorientierte Programmierung mit JAVA. © Klasse Wie in C++ ist die Klasse das primäre Mittel um ein Entity abzubilden Die Eigenschaften.
Tutorium Software-Engineering SS14 Florian Manghofer.
Dr. Wolfram Amme, Virtuelle Vererbung, Informatik II, FSU Jena, SS Auflösung von Konflikten bei Mehrfachvererbung Umbenennung mehrdeutiger Methoden.
, Dr. Wolfram Amme, Softwareentwicklung in Java, FSU Jena, SS Kapselung von Daten I Gründe für die Datenkapselung Datenkonsistenz leichtere.
Vererbung in Java. public abstract class Form { protected int breite; protected int hoehe; protected String farbe; /** * Erzeuge eine Form der Breite.
Konstruktoren.
„Was du ererbt von Deinen Vätern hast, erwirb es, um es zu besitzen.“
Venusspiegel und Marsschild
OOP II.
Es gibt Klassen, die mit der Entwicklungsumgebung ausgeliefert werden
9. Vererbung und Polymorphie
Implementieren von Klassen
Vererbung in Java Von Jan und Eddi.
 Präsentation transkript:

Vererbungskonzepte in Java Ahmad-Nessar Nazar Vererbungskonzepte in Java Walther-Rathenau-Gewerbeschule Nazar

Ein UML-Klassendiagramm Ahmad-Nessar Nazar Ein UML-Klassendiagramm Schulklasse 0..1 0..1 Klassenraum Freizeitraum 1..* 0..1 0..1 * 0..1 1 0..1 unterrichtet Kurs Klassenlehrer 1 1 * Schulgebäude 1 1..5 1..32 1..32 Lehrer Schüler 1 1..* * * 1..5 1..* Hausmeister 0..* * * * 1 1 Sekretärin 1..* 1 Schulleiter 1..* Lehrerzimmer 1 Walther-Rathenau-Gewerbeschule Nazar

Ein UML-Klassendiagramm Ahmad-Nessar Nazar Ein UML-Klassendiagramm Schulklasse 0..1 0..1 Klassenraum Freizeitraum 1..* 0..1 0..1 * 0..1 1 0..1 unterrichtet Kurs Klassenlehrer 1 1 * Schulgebäude 1 1..5 1..32 1..32 Lehrer Schüler 1 1..* * * 1..5 1..* Hausmeister 0..* * * * 1 1 Sekretärin 1..* 1 Schulleiter 1..* Lehrerzimmer 1 Walther-Rathenau-Gewerbeschule Nazar

Vererbung (Generalisierung) Ahmad-Nessar Nazar Vererbung (Generalisierung) Klassenraum, Freieitraum und Lehrerzimmer erben die Eigenschaft raumNr der Klasse Raum... Raum Generalisierung (Superklasse) + raumNr: int Spezialisierungen (Subklassen) Klassenraum Freizeitraum Lehrerzimmer - typ: String - spiele: ArrayList - anzFach: int Walther-Rathenau-Gewerbeschule Nazar

Umsetzung in Java Ahmad-Nessar Nazar Walther-Rathenau-Gewerbeschule

Ein UML-Klassendiagramm Ahmad-Nessar Nazar Ein UML-Klassendiagramm Schulklasse 0..1 0..1 Klassenraum Freizeitraum 1..* 0..1 0..1 * 0..1 1 0..1 unterrichtet Kurs Klassenlehrer 1 1 * Schulgebäude 1 1..5 1..32 1..32 Lehrer Schüler 1 1..* * * 1..5 1..* Hausmeister 0..* * * * 1 1 Sekretärin 1..* 1 Schulleiter 1..* Lehrerzimmer 1 Walther-Rathenau-Gewerbeschule Nazar

Vererbung (Generalisierung) Ahmad-Nessar Nazar Vererbung (Generalisierung) Person + name: String Schulleiter Sekretärin Schüler Hausmeister Lehrer - schularten: Set - klasse:String - bereich:String - deputat: int Walther-Rathenau-Gewerbeschule Nazar

Vererbung (Generalisierung) Ahmad-Nessar Nazar Vererbung (Generalisierung) Auslagern von Gemeinsamkeiten in eine Superklasse (Generalisierung). Jede Subklasse erbt i.d.R alle nicht privaten Eigenschaften (Attribute) und Methoden der Superklasse. Jede Subklasse kann zudem weitere Attribute und Methoden definieren (Spezialisierung). Einige offensichtliche Vorteile: Vermeidung von Code-Duplizierung einfache Wartung schnelle Erweiterbarkeit Wird eine Klasse als final class deklariert, so kann von ihr nicht geerbt werden. Walther-Rathenau-Gewerbeschule Nazar

Vererbung (Generalisierung) Ahmad-Nessar Nazar Vererbung (Generalisierung) Vererbungen sind spezielle Beziehungen („ist-ein“-Beziehungen). In Java kann eine Klasse kann nur von einer Klasse direkt erben (Einfachvererbung). In Java wird Vererbung zwischen zwei Klassen durch das Schlüsselwort extends ausgedrückt: Fehlt bei einer Klassendeklaration das Schlüsselwort extends, so ist automatisch die Klasse java.lang.Object die Superklasse. Eigenschaften und Verhalten können über mehrere Generationen vererbt werden (Vererbungshierarchien). Konstruktoren werden nicht vererbt. public class Subklasse extends Superklasse{....} Walther-Rathenau-Gewerbeschule Nazar

Vererbungshierarchie Ahmad-Nessar Nazar Vererbungshierarchie Object Fahrzeug LKW PKW Motorrad Fahrrad ....... ....... ....... ....... Walther-Rathenau-Gewerbeschule Nazar

Ahmad-Nessar Nazar Aufgabe 1 (20 Minuten) Entwerfen Sie ein UML-Klassendiagramm für die Verwaltung von Ländern, Städten, Flüssen, Seen und Meeren. Ein Land besitzt mehrere Städte. Ein Stadt liegt in einem Land. Jede Stadt kann an einem oder mehreren Seen/Flüssen liegen. Außerdem kann eine Stadt auch an mehreren Meeren angrenzen. Zu jedem Land soll zudem der Name, der Ländercode, die Einwohnerzahl und die Fläche erfasst werden. Auch zu jeder Stadt ist der Name, die Einwohnerzahl, die Längen- und die Breitengrade zu verwalten. An Seen und Meeren interessiert in erster Linie die Tiefe. Außerdem ist interessant, um welche Art von Meer oder See es sich handelt. An Flüssen interessiert neben der Länge vorallem deren Zuflüsse. Außerdem möchte man für jeden der drei Gewässer wissen, welche Städte bzw. welche Länder an ihnen angrenzen. Walther-Rathenau-Gewerbeschule Nazar

Ahmad-Nessar Nazar Lösungsvorschlag Aufgabe: Überführen Sie dieses Diagramm in Java. Erzeugen Sie einige Objekte... rekursive Beziehung Walther-Rathenau-Gewerbeschule Nazar

Ahmad-Nessar Nazar Aufgabe 2 (30 Minuten) Überführen Sie das Diagramm aus der letzten Folie in Java. Erzeugen Sie ein paar Länder, Städte, Meere und Flüsse. Programmieren Sie eine Methode public double getSumLength() in der Klasse Fluss der die Länge des Fluss addiert mit der Länge aller seiner Zuflüsse zurückgibt. Verwenden Sie Rekursion. Testen Sie die Methode! Walther-Rathenau-Gewerbeschule Nazar

Vererbungen drücken ist-ein-Beziehungen aus Ahmad-Nessar Nazar Vererbungen drücken ist-ein-Beziehungen aus Ein Fahrzeug ist ein Object Ein LKW ist ein Fahrzeug Ein PKW ist ein Fahrzeug Objekte von Subtypen können statt Objekte von Super- typen eingestzt werden: Umgekehrt aber gilt nicht: => Object fahrzeug = new Fahrzeug(); Fahrzeug lkw = new LKW(); Fahrzeug pkw = new PKW(); Object str = new String(“Hallo“); Fahrzeug fahrzeug = new Object(); LKW lkw = new Fahrzeug(); PKW pkw = new Fahrzeug(); Walther-Rathenau-Gewerbeschule Nazar

Referenztypen sind nicht änderbar Ahmad-Nessar Nazar Referenztypen sind nicht änderbar Auf Objekte werden über Referenzvariablen zugegriffen. Der Typ einer Referenzvariablen darf nach der Deklaration nicht mehr geändert werden. Das Objekt, das von einer Referenzvariable referenziert wird, kann aber nachträglich ersetzt werden: Der Referenztyp (Typ einer Referenzvariable) legt fest, welche Methoden des zugehörigen Objekts aufgerufen werden können (siehe nächste Folie) LKW lkw = new LKW(); Fahrzeug lkw = new LKW(); Fahrzeug fzg = new Fahrzeug(); fzg = new LKW(); Walther-Rathenau-Gewerbeschule Nazar

Referenztypen legen die Methodenauswahl fest Ahmad-Nessar Nazar Referenztypen legen die Methodenauswahl fest Fahrzeug fzg = new Fahrzeug(); fzg = new LKW(); fzg.beschleunige(70); //Aufruf einer Fahrzeug-Methode Obwohl im obigen Beispiel fzg ein LKW-Objekt zugewiesen wird, überwacht der Compiler, dass auf fzg nur die Methoden aufgerufen werden, die in der Klasse Fahrzeug oder in Supertypen davon definiert wurden. Der Referenztyp Fahrzeug legt damit die Methodenauswahl fest! Obwohl fzg ein LKW-Objekt ist, können aufgrund seines Referenztyps Fahrzeug nur die Methoden auf fzg aufgerufen werden, die in der Klasse Fahrzeug definiert sind. Besitzt allerdings die LKW-Klasse eine exakt gleichnamige Methode namens beschleunige mit denselben Parametertypen und Rückgabetyp, so wird zur Laufzeit die beschleunige-Methode der LKW-Klasse aufgerufen (→ polymorpher Methodenaufruf)! Walther-Rathenau-Gewerbeschule Nazar

Polymorpher Methodenaufruf Ahmad-Nessar Nazar Polymorpher Methodenaufruf Dynamisches Binden: Zur Laufzeit wird geschaut, welches Objekt fzg tatsächlich entspricht. Es wird dann die Passende Methode aufgerufen. Ausgabe: Walther-Rathenau-Gewerbeschule Nazar

Vorteile der Polymorphismus Ahmad-Nessar Nazar Vorteile der Polymorphismus Höhere flexibilität durch dynamisches Binden. Einfache Programmlogik => Wartungsaufwand wird reduziert. ohne Polymorphismus mit Polymorphismus LKW beschleunigeLKW() beschleunige() PKW beschleunigePKW() ... Walther-Rathenau-Gewerbeschule Nazar

Ahmad-Nessar Nazar Polymorphe Variablen Objekte von Subtypen können statt Objekte von Super- typen eingestzt werden: Die Variable fahrzeug ist polymorph (vielseitig). Sie kann Objekte verschiedener Typen (z. B. LKW- oder PKW-Objekte) repräsentieren (referenzieren) Walther-Rathenau-Gewerbeschule Nazar

Up- and Downcasts Fahrzeug fzg = new LKW(); Ahmad-Nessar Nazar Up- and Downcasts Bisher können auf fzg nur Methoden die in der Klasse Fahrzeug definiert sind, aufgerufen werden. Möchte man aber eine LKW-spezifische Methode aufrufen, muss fzg explizit wieder in ein LKW-Objekt gecastet (Downcast) werden: Fahrzeug fzg = new LKW(); //ist implizit ein Upcast! Ein Upcast kann aber auch (unnötigerweise) explizit geschehen: Fahrzeug fzg = (Fahrzeug) new LKW(); Fahrzeug fzg = new LKW(); LKW lkw = (LKW) fzg; //Downcast nach LKW lkw.showLadeRaumGröße(); Walther-Rathenau-Gewerbeschule Nazar

Der instanceof-Operator Ahmad-Nessar Nazar Der instanceof-Operator Mithilfe des instanceof-Operators kann der tatsächliche Referenztyp eine Variable ermittelt werden: Walther-Rathenau-Gewerbeschule Nazar

Der instanceof-Operator Ahmad-Nessar Nazar Der instanceof-Operator Der instanceof-Test ist hier optional, schützt aber im Allgemeinen vor unerwarteten ClassCastException's Walther-Rathenau-Gewerbeschule Nazar

Methoden überschreiben (Overriding) Ahmad-Nessar Nazar Methoden überschreiben (Overriding) In einer Subklasse können geerbte Methoden der Superklasse überschrieben werden, sofern diese in der Superklasse nicht mit dem Schlüsselwort final deklariert wurden. Der Name, der Rückgabetyp (Ausnahme covariant-Rückgabetypen, siehe nächste Folie) und die Parametertypen der überschriebenen Methoden müssen mit denen der Orginalmethoden in der Superklasse übereinstimmen. Konstruktoren können nicht überschrieben werden, weil sie nicht vererbt werden! Walther-Rathenau-Gewerbeschule Nazar

Kovariante Rückgabetypen Ahmad-Nessar Nazar Kovariante Rückgabetypen Im folgenden Ausnahmefall (ab Java 5 möglich) kann der Rückgabetyp der überschrieben Methode von der geerbten Methode ausweichen: Wenn der Rückgabetyp der überschriebenen Methode ein Untertyp (Subtyp) der geerbten Methode ist (kovariant). Alles OK, weil String ist ein Subtyp von Object ist. Walther-Rathenau-Gewerbeschule Nazar

Ahmad-Nessar Nazar final-Methoden final deklarierte Methoden werden zwar geerbt, sie dürfen aber nicht überschrieben werden! Kompilerfehler, weil die Methode geerbt ist, aber nicht überschrieben werden darf! Walther-Rathenau-Gewerbeschule Nazar

private-Methoden private deklarierte Methoden werden nicht geerbt! Ahmad-Nessar Nazar private-Methoden private deklarierte Methoden werden nicht geerbt! Das ist keine überschriebene, sondern eine eigene Methode der Klasse B! Walther-Rathenau-Gewerbeschule Nazar

Zugriffsmodifikatoren Ahmad-Nessar Nazar Zugriffsmodifikatoren Zugriffsmodifikatoren legen die Zugänglichkeit der Objektmitglieder fest. Es gibt die folgenden Zugriffsmodifikatoren: public (keine Einschränkung bei der Sichbarkeit) default (Defaultsichbarkeit: innerhalb des Packages sichbar) protected (innerhalb des Packages und in Subklassen sichtbar) private (nur innerhalb der Klasse sichtbar) public hat die größte Zugänglichkeitsstufe und private die niedrigste! Fehlt die Angabe eines Zugriffsmodifikators, so hat die Variable oder die Methode automatisch die Defaultsichtbarkeit. default ist kein Java-Schlüsselwort! Walther-Rathenau-Gewerbeschule Nazar

Zugriffsmodifikatoren und Overriding Ahmad-Nessar Nazar Zugriffsmodifikatoren und Overriding Die Zugänglichkeit einer überschriebenen Methode darf nicht geringer sein als die der zugehörigen Methode in der Superklasse. Kompilerfehler, weil private restriktiver ist als public. Zur Laufzeit wird die showData()-Methode der LKW-Klasse ausgeführt. Da f aber als Fahrzeug deklariert ist, kann es nicht auf die showData()- Methode zugreifen. Walther-Rathenau-Gewerbeschule Nazar

Overriding und Exception's Ahmad-Nessar Nazar Overriding und Exception's Überschriebene Methode dürfen keine neuen oder ristriktiveren Exceptions werfen als die ursprünglichen Methoden. Mit restriktiv ist gemeint, dass die geworfenen Exceptions der überschriebenen Methoden in der Vererbungshierarchie nicht vor (aber durchaus nach) dem Exceptiontyp der ursprünglichen Methode vorkommen dürfen. IOException kommt in der Vererbungshierarchie vor dem FileNotFoundException ist damit restriktiver! Walther-Rathenau-Gewerbeschule Nazar

Aufruf von Superklasse-Methoden Ahmad-Nessar Nazar Aufruf von Superklasse-Methoden Aus einer überschrieben Methode kann die ursprüngliche Methode mittels super.<Methodenname> aufgerufen werden: Ausgabe: Walther-Rathenau-Gewerbeschule Nazar

Übung Welche Ausgabe erscheint am Bildschirm? Ahmad-Nessar Nazar Walther-Rathenau-Gewerbeschule Nazar

static-Methoden Welche Ausgabe erscheint am Bildschirm? Ahmad-Nessar Nazar static-Methoden Welche Ausgabe erscheint am Bildschirm? static-Methoden sind an Klassen gebunden und können nicht überschrieben werden. Walther-Rathenau-Gewerbeschule Nazar

Überladene Methoden (Overloaded Methods) Ahmad-Nessar Nazar Überladene Methoden (Overloaded Methods) Eine Methode wird als überladen bezeichnet, wenn sie mindestens zweimal mit demselben Namen in der Klasse definiert wurde. Überladene Methoden müssen sich in ihren Eingabeparameter- typen (Argumenttypen) unterscheiden! Sie können aber unterschiedliche Rückgabetypen haben! Korrekte Überladung, da hier ein Argument vom Typ Fahrzeug verlangt wird! Ungültige Überladung, da die Argumentliste nicht geändert wurde. Walther-Rathenau-Gewerbeschule Nazar

Überladene Methoden (Overloaded Methods) Ahmad-Nessar Nazar Überladene Methoden (Overloaded Methods) Eine Methode wird dann als überladen bezeichnet, wenn mindestens eine zweite gleichnamige Methode in derselben Klasse oder in einer Subklasse existiert! Überladene Methoden müssen die Argumentliste (Typen) verändern! Überladene Methoden können die Rückgabetypen verändern! Überladene Methoden können die Zugriffsmodifikatoren (public, protected, default und package) verändern! Überladene Methoden können beliebig neue Exceptions werfen! Walther-Rathenau-Gewerbeschule Nazar

Konstruktoren und Vererbung Ahmad-Nessar Nazar Konstruktoren und Vererbung Ezeugung von Object mittels impliziter super()-Aufruf Ezeugung von B mittels impliziter super()-Aufruf Ezeugung von B mittels impliziter super()-Aufruf Walther-Rathenau-Gewerbeschule Nazar

Konstruktoren und Vererbung Ahmad-Nessar Nazar Konstruktoren und Vererbung Konstruktoren werden nicht vererbt und können deshalb auch nicht überschrieben werden! Ein Konstruktor kann aber beliebig oft in einer Klasse überladen werden. Die erste Anweisung in einem Konstruktor ist entweder ein this()- oder ein super()-Aufruf. Falls beide Anweisungen fehlen, fügt der Kompiler automatisch die Anweisung super(); als erste Anweisung im Konstruktor hinzu! Mittels dem Befehl super() wird der Standard-Konstruktor der Superklasse aufgerufen. Falls es sich bei der Superklasse nicht um die Klasse Object handelt muss deren Konstruktor erneut mittels super() den Konstruktor seiner Superklasse aufrufen usw.. Mittels this() kann ein Konstruktor einen anderen Konstruktor der eigenen Klasse aufrufen! Walther-Rathenau-Gewerbeschule Nazar