Vererbung. Oberklassen und Unterklassen

Ähnliche Dokumente
6. Globalübung (zu Übungsblatt 8)

Beispiel: Zwischen der Oberklasse und der abgeleiteten Klasse besteht eine ist ein Beziehung. Eine abgeleitete Klasse stellt eine Spezialisierung der

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

4. Vererbung Die Klasse Object. Die Klasse Object

5.6 Vererbung. Vererbung

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

Objektorientierung (OO)

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Vererbung. Generalisierung und Spezialisierung Vererbung und Polymorphismus

2.13 Vererbung. Rainer Feldmann Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/ Article

Programmieren in Java

Java Einführung Vererbung und Polymorphie. Kapitel 13

Javakurs für Anfänger

Kapitel 6. Vererbung

4. Vererbung. Idee der Vererbung. Wir wollen ein Verwaltungsprogramm für CDs und Videos entwickeln. Wir stellen uns dazu folgende Klassen vor:

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

Einstieg in die Informatik mit Java

Kapitel 6. Vererbung

Objektorientierte Programmierung Studiengang Medieninformatik

Informatik II Übung, Woche 17

Javakurs für Anfänger

OOP und Angewandte Mathematik. Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik

Begriffe 1 (Wiederholung)

Einstieg in die Informatik mit Java

Vererbung und Polymorphie

Kapitel 13. Abstrakte Methoden und Interfaces. Fachgebiet Knowledge Engineering Prof. Dr. Johannes Fürnkranz

Programmierkurs Java. Vererbung. Prof. Dr. Stefan Fischer Institut für Telematik, Universität zu Lübeck

11.3 Virtuelle Methoden

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

Einführung in die Programmierung für NF. Vererbung

12 Abstrakte Klassen, finale Klassen und Interfaces

Vererbung. Martin Wirsing. Ziele. Vererbung

Kapitel 6. Vererbung

Algorithmen und Programmierung II

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

3 Objektorientierte Konzepte in Java

Grundzüge der Programmierung. Wiederverwendung VERERBUNG

1. Abstrakte Klassen

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

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Programmierkurs Java

HSR Rapperswil 2001 Markus Rigling. Programmieren: Vererbung. 1 Variante 2

Java Vererbung. Inhalt

14 Abstrakte Klassen, finale Klassen, Interfaces

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

Einführung in die Programmierung

Polymorphie/Späte Bindung Abstrakte Klassen Interfaces. Polymorphie/Späte Bindung Abstrakte Klassen Interfaces

Vererbung, Polymorphie

Probeklausur: Programmierung WS04/05

Einführung in C# Teil 3. Matthias Nübling

Vorausgesetzte Grundkenntnisse. Inhalt. Klassenhierarchie und Vererbung. Vererbung. Klassenhierarchie und Vererbung. Einführung in C# Teil 3

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden.

Teil 2: OOP und JAVA (Vorlesung 11)

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

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

9. Vererbung Einführung in die Programmierung (fbw) Sommersemester 2008 Prof. Dr. Bernhard Humm Hochschule Darmstadt, fbi

C++ - Objektorientierte Programmierung Vererbung

Einstieg in die Informatik mit Java

2. Vererbung und Kapselung

Programmieren I. Kapitel 8. Vererbung

Vererbung. Vererbung von Methoden und Instanzvariablen. Vererbung als Realisierung einer is-a Beziehung.

Interfaces und Vererbung

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

Rückblick: Benutzerdefinierte Datentypen Definition der Klasse Vektor als Container für 2-dimensionale Vektoren

Programmieren in Java

Liste Programmieren Java Überblick

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

Algorithmen und Datenstrukturen

Konzepte objektorientierter Programmierung

Vererbung und Polymorphie

2. Vererbung und Polymorphie. Vererbung (1/2) Beispiel (1/2) Vererbung (2/2) Eine Unterklasse wird folgendermaßen definiert

Objektorientierte Programmierung (OOP) mit Matlab - Ein Crashkurs

Objektorientierung. Objekte

Java, OO und UML Fortsetzung

7. Schnittstellen Grundlagen zu Schnittstellen. 7. Schnittstellen

Vorkurs Informatik: Erste Schritte der Programmierung mit C++

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

1 Klassen und Objekte

VIII: Vererbung. Unterklassen einer Klasse. Vererbung von Methoden und Instanzvariablen. Überschreiben von Methoden

Überblick. Überblick zum weiteren Inhalt

Exceptions und Vererbung

Die Klasse java.lang.object. Thorsten Treffer

II.4.1 Unterklassen und Vererbung - 1 -

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

! 1. Unterklassen und Vererbung! 2. Abstrakte Klassen und Interfaces! 3. Modularität und Pakete. II.4.2 Abstrakte Klassen und Interfaces - 1 -

Grundlagen Polymorphismus Eigenschaften virtueller Klassen Mehrfachvererbung bei ROOT. Mehrfache Vererbung. Daniel Beneckenstein. 21.

Programmieren 2 Java Überblick

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

1 Abstrakte Klassen, finale Klassen und Interfaces

Listing 1: Cowboy. Listing 2: Woody

Repetitorium Informatik (Java)

Informatik II Übung 06. Benjamin Hepp 5 April 2017

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Wiederholung: Interfaces

3 Objektorientierte Konzepte in Java

Einstieg in die Informatik mit Java

5. Abstrakte Klassen. Beispiel (3) Abstrakte Klasse. Beispiel (2) Angenommen, wir wollen die folgende Klassenhierarchie implementieren:

9. Zurück zur OOP: Vererbung und Polymorphismus

Java für Bauingenieure

Transkript:

Vererbung Oberklassen und Unterklassen Vererbung ist ein zentrale Bestandteil der Objektorientierung. Man beschreibt damit die Möglichkeit, Eigenschaften und Methoden vorhandener Klassen auf andere (neue) Klassen zu übertragen. Leider ist die Terminologie auf den ersten Blick etwas verwirrend: Die erbende Klasse wird Ableitung oder Spezialisierung der vererbenden Klasse genannt, aber auch Erweiterung oder Unterklasse. Für die vererbende Klasse verwendet man den Begriff Oberklasse. Wenn es sich um eine direkte Vererbung (ohne Zwischenklassen) handelt sprechen wir auch von der Superklasse der entsprechenden Unterklasse. Da jedes Objekt einer Unterklasse alle Eigenschaften der Oberklasse besitzt (es hat sie geerbt), kann es auch gleichzeitig als Objekt der Oberklasse betrachtet werden. Diese Vielgestaltigkeit von Objekten ist eine spezielle Form der Polymorphie, die in der objektorientierten Programmierung eine wichtige Rolle spielt. Um die Begriffe besser zu verstehen, kann man das folgende Standardbeispiel betrachten. Eine Klasse Person wird durch die Atribute Namen und Geburtsjahr charakterisiert. Beschreibt man Student als eine Klasse, die alle Eigenschaften von Person erbt und dazu noch durch eine Matrikelnummer, Hauptfach und Immatrikulationsjahr charakterisiert ist, dann wird die Klasse Student aus der Klasse Person abgeleitet. Ein Student hat spezielle Eigenschaften, die nicht jede beliebige Person hat deshalb sprechen wir von einer Spezialisierung. Gleichzeitig ist Student (im Sinne der charakterisierenden Eigenschaften) eine Erweiterung von Person, denn zu den Personeneigenschaften kommen weitere Attribute (und möglicherweise auch neue Methoden). Da jeder Student auch eine Person ist, kann man im Sinne der Mengenlehre von einer Unterklasse (Untermenge) sprechen. Vererbung ist ein transitiver Begriff. Wenn Informatikstudent eine Unterklasse von Student ist und Student eine Unterklasse von Person, dann ist Informatikstudent auch eine Unterklasse von Person (mit Namen, Geburtsjahr und allen anderen sichtbaren Attributen und Methoden von Person). Im Gegensatz zu einigen anderen objektorientierten Programmiersprachen kennt Java keine Mehrfachvererbung, d.h. eine Klasse A kann nur eine direkte Oberklasse B haben (man nennt B die Superklasse von A), alle anderen Oberklassen von A müssen auch Oberklassen von B sein. Die Zuordnung zur Superklasse B erfolgt schon bei der Defintion von A durch public class A extends B{... Wie wir aus den ersten Beispielen wissen, kann bei einer Klassendefinition auch auf den Zusatz extends B verzichtet werden. In diesem Fall wird die Klasse Object implizit als Superklasse festgelegt. Diese Klasse ist in Java die einzige, die keine Superklasse besitzt. Alle anderen Klassen bilden unter Object eine baumförmige Klassenhierarchie, d.h. jede Klasse A ist Unterklasse von Object und der aufsteigende Weg von A zu Object ist eindeutig. Das folgende Beispiel demonstriert einige Aspekte, die bei der Vererbung zu beachten sind. Die Oberklasse Rectangle gibt eine relativ abstrakte Beschreibung eines Rechtecks nur durch seine Seitenlängen. Spezielle Rechtecke, bei denen die Lage in der Ebene eine Rolle spielt, werden durch die Unterklasse RectangleInPlane beschrieben.

public class Rectangle{ // * "abstraktes" Rechteck ohne konkrete Lage in der Ebene * // * Attribute (Variablen) * // Zwei Seitenlaengen public double a,b; // * Konstruktor(en) * public Rectangle(double a, double b){ this.a = a; this.b = b; // * Methoden * // Flaeche berechnen public double area(){ return a * b; // weitere Methoden wie z.b. Umfang berechnen... //Gleichheitstest public boolean equals(rectangle r){ return((a == r.a && b == r.b) (a == r.b && b == r.a)); Bei der Erweiterung zur Klasse RectangleInPlane ist neben dem Zusatz extends Rectangle zu beachten, dass jeder Konstruktor zuerst einen Konstruktor der Superklasse aufrufen muss. Dieser Aufruf erfolgt aber nicht durch Rectangle(a,b) sondern durch super(a,b). In diesem Beispiel wurde auf den einfachsten Konstruktor verzichtet, dem man einfach die 4 Eckpunkte übergibt und der daraus die Seitenlängen bestimmt. An Stelle dessen findet man die Beschreibung eines Konstruktors, der neben den Seitenlängen einen Eckpunkt pa und den Anstiegswinkel der Seite (pa,pb) verwendet. Die Klasse Point wird hier in der einfachen Version verwendet, bei der die Koordinaten public sind.

public class RectangleInPlane extends Rectangle{ // * Rechteck mit konkreter Lage in der Ebene * // * Attribute (Variablen) * // Seitenlaengen schon in Rectangle // 4 Eckpunkte (entgegen Uhrzeigerrichtung) Point pa, pb, pc, pd; // Winkel zwischen x-achse und Grundseite im Bogenmass // Konvention: Seite mit Laenge a verlaeuft von pa nach pb double alpha; // * Konstruktor(en) * // Konstruktor mit Punkt pa, Winkel und beide Seitenl\"angen gegeben public RectangleInPlane(Point p, double alpha, double a, double b){ super(a,b); // Konstruktor fuer Rectangle pa = p; pb = new Point((p.x)+Math.cos(alpha)*a, (p.y)+math.sin(alpha)*a); pd = new Point((p.x)-Math.sin(alpha)*b, (p.y)+math.cos(alpha)*b); pc = new Point((p.x)+Math.cos(alpha)*a-Math.sin(alpha)*b, (p.y)+math.sin(alpha)*a+math.cos(alpha)*b); this.alpha = alpha; // weitere Konstruktoren denkbar, z.b. wenn pa, pb und Seite b gegeben // dann wird a als pa.dist(pb) berechnet // * Methoden * // Mittelpunkt public Point center(){ Point p = new Point(0.5*((pA.x) + (pc.x)), 0.5*((pA.y) + (pc.y))); return p;

Verdecken und Überschreiben In der Klasse Rectangle haben wir die Methode equals(rectangle r) definiert, weil wir wissen, dass der Operator == nur die Gleichheit der Referenzen überprüfen würde, aber unsere Intention besagt, dass zwei Rechtecke als gleich angesehen werden, wenn ihre Seitenlängen paarweise gleich sind. Ein Blick in das Java API verrät uns, dass die Methode equals(objekt o) bereits in der Klasse Object definiert ist und dort wie der Operator == arbeitet. Mit unserer Definition wurde die Definition aus der Oberklasse Object überschrieben. Man beachte, dass zur Gleichheit von zwei Objekten aus RectangleInPlane auch die Lage (also die Mengen der Eckpunkte) übereinstimmen sollte. Wir verzichten hier auf die konkrete Beschreibung der Methode equals für RectangleInPlane (weil das auf Grund der möglichen Symmetrien zu umfangreichen Fallbetrachtungen führen würde) und kommen zum entscheidenden Punkt: Definiert man equals(rectangleinplane r) für die Klasse RectangleInPlane neu, dann gibt es drei Methoden gleichen Namens und auf Grund der Polymorphie ist unklar, welche von ihnen ausgführt werden soll, wenn equals für eine Object Variable aufgerufen wird, deren Referenz auf ein RectangleInPlane Objekt verweist. Um diese Frage zu beantworten, muss unterschieden werden zwischen dem (deklarierten) Typ einer Referenz und dem Typ des Objekts (Exemplar, Instanz), auf das verwiesen wird. Wir erklären das an einem schematischen Beispiel von zwei Klassen A und B: public class A{ public int a; public A() {a = 1; // Konstruktor public int meth() {return a; public class B extends A{ public int a; // Attr. a aus A wird "beschattet", es gibt jetzt 2 a s public B() { super(); a = 100; public int meth() {return a; // das ist das a aus B public int f() {return super.a; // Attribut a aus der Superkl. A public int g() {return super.meth(); // Methode aus der Superkl. A Wird ein Attribut aus der Oberklasse in der Unterklasse noch einmal neu deklariert, spricht man vom Verdecken oder Beschatten (shadowing) des Attributs der Oberklasse, bei Methoden nennt man es Überschreibung. Diese begriffliche Trennung wird sich als wichtig erweisen. Mit den Anweisungen B bref = new B(); A aref = bref; // Namen betonen, dass es um Referenzen geht wird ein Objekt von Typ B angelegt, auf das zwei Referenzen verweisen: Die Referenz bref vom Typ B und die Referenz aref vom Typ A. Für die zweite Zuweisung muss der Typ von bref nicht explizit umgewandelt werden. Bei aref sind Typinformationen verloren gegangen, d.h. es ist nicht mehr ersichtlich, dass der Verweis auf ein Objekt vom Typ B zeigt. Man kann das aber mit der Bedingung

(aref instanceof B) abfragen, die hier den Wert true bekommt. In diesem Fall ist dann eine explizite Typumwandlung möglich: B cref = (B) aref; // ohne Typumwandlung --> Fehler Den Unterschied zwischen Verdecken und Überschreiben kann man nun in einen kurzen Merksatz fassen: Beim Verdecken (von Attributen) entscheidet der deklarierte Typ der Referenz, beim Überschreiben (von Methoden) der tatsächliche Typ des Objekts (der Instanz). Am Beispiel bedeutet das: int i; i = bref.a; // i hat den Wert 100 i = aref.a; // Typ der Referenz entscheidet, i hat den Wert 1 i = bref.meth(); // i hat den Wert 100 i = aref.meth(); // Typ des Objekts entscheidet, i hat den Wert 100 i = ((A)bref).a; // Umwandlung des Typs der Referenz, i wird 1 i = ((A)bref).meth(); // Objekt weiter vom Typ B, i hat den Wert 100 i = bref.f(); /* durch super bekommt man ein Objekt der Oberkl. A, i hat den Wert 1 */ i = bref.g(); /* durch super bekommt man ein Objekt der Oberkl. A, i hat den Wert 1 */