Vererbung. Das Prinzip der Vererbung im täglichen Leben:

78
Vererbung

Transcript of Vererbung. Das Prinzip der Vererbung im täglichen Leben:

Page 1: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

Vererbung

Page 2: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

Das Prinzip der Vererbung im täglichen

Leben:

Page 3: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

Walter besitzt ein Haus.

Page 4: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

Walter erbt nun 10000Euro. Also besitzt er insgesamt:

10000

+

Page 5: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

In Java:

Erblasser Erbe

--->Basisklasse

--->

abgeleitete Klasse

In Java darf man einenErben (abgeleitete Klasse)

selbst basteln

Page 6: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

Statt Basisklasse sagt man auch:Oberklasse, Vaterklasse

Page 7: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

Statt abgeleiteter Klasse sagt man auch:Unterklasse, Sohnklasse, Subklasse

Page 8: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

Eine abgeleitete Klasse wird in Java wie folgt angegeben:

class Ei extends Huhn{

...}

Basisklasse abgeleitete Klasse

Bezeichner

Page 9: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

Die abgeleitete Klasse (kurz: Ableitung) besitzt

automatisch alle Member (Ausnahme: Konstruktor)

der Basisklasse.

Page 10: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

Beispiel:

Page 11: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

Von einem Flachdachhaus wird ein Modell

(Draufsicht) erstellt:

Page 12: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

Der Einfachheit halber wird nur die Grundfläche (ohne Zimmer, usw.) des Hauses abgebildet.Aufgabe:Realisieren Sie die Klasse Modell in Java.

Page 13: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

class Modell{ private double l; private double b;

public Modell(double pl, double pb){ l = pl; b = pb; }

public void setL(double pl){ l = pl; } // weiter...

Page 14: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

public void setB(double pb){ b = pb; }

public double getL(){ return(l); }

public double getB(){ return(b); }

public double getFlaeche(){ return(l*b); }};

Page 15: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

Jetzt soll ein “genaueres“ Modell des Flachdachhauses erstellt werden: Modell aus Styropor (oder Ton). Aufgabe:Realisieren Sie in Java die Klasse Gmodell.

Page 16: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

Standardmäßig könnte man das mit den 3 Attributen Länge, Breite, Höhe und den zugehörigen set- und get-Methoden machen.

Also wie folgt:

Page 17: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

class Gmodell{ private double l; private double b; private double h;

public Gmodell(double pl, double pb, double ph){ l = pl; b = pb; h = ph; }

Page 18: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

public void setL(double pl){ l = pl; } public void setB(double pb){ b = pb; }

public double getL(){ return(l); }

public double getB(){ return(b); }

Page 19: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

public void setH(double ph){ h = ph; }

public double getH(){ return(h); }

public double getVolumen(){ return(l*b*h); }};

Page 20: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

Gibt es eine andere Lösung, bei der man sich Schreibarbeit sparen kann? Wie kann man Softwareteile dabei wiederverwenden ?

Indem man die Vererbung benutzt.

Page 21: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

Welche Member der Klasse Modell kann man übernehmen (erben) ?

Welche Member kommen neu dazu ?

Page 22: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

class Modell{ private double l; private double b;

public Modell(double pl, double pb){... public void setL(double pl){... public void setB(double pb){... public double getL(){... public double getB(){... public double getFlaeche(){...};

Alle außer dem Konstruktor

Welche Member werden vererbt ?

Welche Member müssen neu dazu ?

Page 23: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

class Gmodell private double l;private double l; private double b;private double b;

public:

public void setL(double pl){...public void setL(double pl){... public void setB(double pb){...public void setB(double pb){... public double getL(){...public double getL(){... public double getB(){...public double getB(){... public double getFlaeche(){...public double getFlaeche(){...

}

private double h;

public double getVolumen(){...

Die reliefförmig dargestellten Member werden geerbt.

Die rot dargestellten Member kommen neu dazu.

Wie wird eine Vererbung erreicht ?

extends Modell{

public void setH(double ph){...public double getH(){...

public Gmodell(double pl, double pb,double ph){...

Page 24: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

Aufgabe:Schreiben Sie das komplette Programm mit den zugehörigen Klassen in Java

Page 25: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

public class MainVererbung1{ public static void main(String[] args){ // Anweisungen siehe später }}

class Modell{ private double l; private double b;

public Modell(double pl, double pb){ l = pl; b = pb; }

Page 26: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

public void setL(double pl){ l = pl; }

public void setB(double pb){ b = pb; }

public double getL(){ return(l); }

public double getB(){ return(b); }

public double getFlaeche(){ return(l*b); }};

Page 27: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

class Gmodell extends Modell{ private double h; public Gmodell(double pl, double pb, double ph){ super(pl,pb); setH(ph); }

public void setH(double ph){ h = ph; }

public double getH(){ return(h); }

public double getVolumen(){ return(getFlaeche()*h); }}

Diese Methode gibt es nicht in der Klasse Gmodell. Warum kann sie trotzdem verwendet werden? Weil ...

1) Die Methode von der Klasse Modell vererbt wird und es sie deshalb in Gmodell gibt 2) Weil die Methode public ist, kann auf sie zugegriffen werden.

Mit super wird ein Konstruktor der Oberklasse aufgerufen. Näheres dazu später.

Page 28: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

class Gmodell extends Modell{ private double h; public Gmodell(double pl, double pb, double ph){ super(pl,pb); setH(ph); }

public void setH(double ph){ h = ph; }

public double getH(){ return(h); }

public double getVolumen(){ return(getFlaeche()*h); }}

Wie heißt der Konstruktor der Oberklasse und wie viele Parameter hat er?

Der Konstruktor heißt Modell und er hat zwei Parameter

Page 29: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

class Gmodell extends Modell{ private double h; public Gmodell(double pl, double pb, double ph){ super(pl,pb); setH(ph); }

public void setH(double ph){ h = ph; }

public double getH(){ return(h); }

public double getVolumen(){ return(getFlaeche()*h); }}

Was könnte man statt dem Aufruf der Methode setH(ph) auch noch machen?

h = ph;

Page 30: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

Warum ist folgende Lösung falsch?

Page 31: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

class Gmodell extends Modell{ private double h; public Gmodell(double pl, double pb, double ph){ super(pl,pb); setH(ph); }

public void setH(double ph){ h = ph; }

public double getH(){ return(h); }

double getVolumen(){ return(b*l*h); }}

Warum ist diese Lösung falsch ?

Die Member b und l gibt es zwar in der Klasse GModell (sie wurden vererbt). Allerdings sind sie private. Auf vererbte private-Member kann weder innerhalb noch außerhalb der Klasse zugegriffen werden.

Page 32: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

class Gmodell extends Modell{ private double h; public Gmodell(double pl, double pb, double ph){ super(pl,pb); setH(ph); }

public void setH(double ph){ h = ph; }

public double getH(){ return(h); }

double getVolumen(){ return(b*l*h); }}

Welche Lösung wäre auch noch möglich?

Die Methoden getB() und getL() sind public. Deswegen dürfen sie benutzt werden.

return(getB()*getL()*h);

Page 33: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

class Gmodell extends Modell{ private double h; public Gmodell(double pl, double pb, double ph){ super(pl,pb); setH(ph); }

public void setH(double ph){ h = ph; }

public double getH(){ return(h); }

double getVolumen(){ return(b*l*h); }}

Warum muss man getB() und getL() verwenden, aber nicht getH(), sondern h ?

h wird nicht vererbt und ist ein Attribut von Gmodell. Deshalb kann man innerhalb der Klasse Gmodell auf h zugreifen.

return(getB()*getL()*h);

Page 34: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

class Gmodell extends Modell{ private double h; public Gmodell(double pl, double pb, double ph){ super(pl,pb); setH(ph); }

public void setH(double ph){ h = ph; }

public double getH(){ return(h); }

double getVolumen(){ return(pb*pl*h); }}

Warum ist das nicht korrekt?

Auf die Variablen pb und pl kann nicht zugegriffen werden, da sie weder ...

ein Attribut der Klasse, noch ein Parameter bzw. eine lokale Variable der Methode getVolumen() sind.

Page 35: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

public Gmodell(double pl, double pb, double ph){ super(pl,pb); setH(ph); }Da die Klasse Gmodell von der Klasse Modell erbt, muss beim Anlegen eines Objekts der Klasse Gmodell auch der Konstruktor der Klasse Modell aufgerufen werden.

Wird dies nicht gemacht, dann wird automatisch (ohne Zutun des Programmierers) der Standardkonstruktor der Klasse Modell aufgerufen.

Was passiert, wenn der Standardkonstruktor nicht existiert ?

Dann wird dieser automatisch vom Compiler angelegt, außer ....

es gibt einen Konstruktor mit (1, 2, 3, ...) Parametern.Dann liefert der Compiler eine Fehlermeldung.

Page 36: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

MerkeWenn ein Konstruktor der Unterklasse nicht mittels super(...) einen Konstruktor der Oberklasse aufruft, dann wird automatisch der Standardkonstruktor (=Konstruktor mit 0 Parametern) der Oberklasse aufgerufen. Der Sinn davon ist, dass alle Attribute (auch die der Oberklassen) einen definierten Wert bekommen sollen, auch wenn der Programmierer vergisst, den Konstruktor der Oberklasse aufzurufen.

Page 37: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

Falls dieser Standardkonstruktor nicht existiert, wird er automatisch vom Compiler erzeugt, außer ein anderer Konstruktor (mit mindestens einem Parameter) existiert schon. In diesem Fall bringt der Compiler dann eine Fehlermeldung.Wenn man super(...) in einem Konstruktor benutzt, muss dies die erste Anweisung in dem Konstruktor sein, d.h. vor super(...) darf keine Anweisung stehen!

Page 38: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

public Gmodell(double pl, double pb, double ph){ super(pl,pb); setH(ph); } Was würde also geschehen, wenn man

diese Anweisung in unserem Programm weglassen würde?

Dann würde automatisch der Standardkonstruktor der Klasse Modell aufgerufen werden. Da dieser nicht existiert und er auch nicht automatisch erzeugt wird (da es ja schon in der Klasse Modell einen Konstruktor mit zwei Parametern gibt) meldet der Kompiler einen Fehler.

Page 39: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

Beispiel für die Benutzung der o.g. Klassen in einem

Hauptprogramm.Welche Werte bekommen

die Variablen in den Zuweisungen?

Page 40: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

public class MainVererbung1{ public static void main(String[] args){ Modell m = new Modell(10,20); Gmodell g = new Gmodell(2,3,4); double a,b,c,f,v; // ...

}}

Die Parameter müssen eigentlich alle vom Datentyo double sein und nicht von Datentyp int. Doch der Compiler ist hier gutmütig, verzeiht und wandelt int in double um. Stichwort: "Parameterübergabe und Konvertierung" am Schluss dieser Präsentation.

Bevor wir näher auf die einzelnen Anweisungen eingehen, noch eine Frage:Was ist streng genommen falsch bei dem

Aufruf mit den obigen Parametern

Page 41: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

public class MainVererbung1{ public static void main(String[] args){ Modell m = new Modell(10,20); Gmodell g = new Gmodell(2,3,4); double a,b,c,f,v; // ...

}}

Adresse Wert

...

0420 l=10

b=20

...

Was ist m ?Was geschieht im Arbeitsspeicher?

Im Arbeitsspeicher wird "irgendwo" Speicher für ein Objekt reserviert, auf das m zeigt. Dieses Objekt besteht aus 2 "Schubladen" l und b und wird durch den zweiparametrigen Konstruktor Modell vorbelegt

m

Page 42: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

public class MainVererbung1{ public static void main(String[] args){ Modell m = new Modell(10,20); Gmodell g = new Gmodell(2,3,4); double a,b,c,f,v; // ...

}}

m

g

Was ist g ?Was geschieht im Arbeitsspeicher?

Im Arbeitsspeicher wird "irgendwo" Speicher für ein Objekt reserviert, auf das g zeigt. Dieses Objekt besteht aus 3 "Schubladen" l, b h und wird durch den dreiparametrigen Konstruktor Gmodell vorbelegt.

Adresse Wert

...

0420 l=10

b=20

...

0470 l=2

b=3

h=4

Page 43: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

public class MainVererbung1{ public static void main(String[] args){ Modell m = new Modell(10,20); Gmodell g = new Gmodell(2,3,4); double a,b,c,f,v; // ...

}}

m

g

Adresse Wert

...

0420 l=10

b=20

...

0470 l=2

b=3

h=4

Gibt es einen Zusammenhang zwischen m und g ?

nein!

Page 44: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

public class MainVererbung1{ public static void main(String[] args){ Modell m = new Modell(10,20); Gmodell g = new Gmodell(2,3,4); double a,b,c,f,v; a = m.getL(); b = m.getB(); c = m.getH(); f = m.getFlaeche(); v = m.getVolumen(); a = g.getL(); b = g.getB(); c = g.getH(); f = g.getFlaeche(); v = g.getVolumen(); }}

// a=10// b=20// Fehler !!// f=200

// a=2// b=3// c=4// f=6 // v=24

// Fehler !!

Was bewirken die folgenden Anweisungen?

Die Methode gibt es nicht in der Klasse Modell

Die Methode gibt es nicht in der Klasse Modell

Page 45: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

Verdeckte Member

Page 46: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

class Gmodell extends Modell{ private double h; public Gmodell(double pl, double pb, double ph){... public void setH(double ph){... public double getH(){... public double getVolumen(){... public double getFlaeche(){...}

Alles gleich wie vorher außer, daß eine Methode gleichen Namens wie in der Basisklasse existiert, die die Oberfläche des Modells (Quaders) berechnet. Wie muss sie implementiert werden ?

Page 47: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

double getFlaeche(){ return(2*(getL()*getB()+getL()*h +getB()*h)); }

Warum ist diese Lösung falsch ?

Die Member b und l gibt es zwar in der Klasse GModell (sie wurden vererbt). Allerdings sind sie private. Auf vererbte private-Member kann weder innerhalb noch außerhalb der Klasse zugegriffen werden.

double getFlaeche(){ return(2*(l*b+l*h+b*h));}

Page 48: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

public class MainVererbung1{ public static void main(String[] args){ double f;

Gmodell g = new Gmodell(2,3,4); f = g.getFlaeche(); }

Es wird auf die Methode der Unterklasse und nicht der Oberklasse zugegriffen, weil die Methode der Oberklasse durch die Methode der Unterklasse verdeckt wird.

// f=52

Von welcher Klasse (Modell oder Gmodell) wird diese Methode aufgerufen ?

// 52=2(2*3+2*4+3*4)

Page 49: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

public class MainVererbung1{ public static void main(String[] args){ double f;

Gmodell g = new Gmodell(2,3,4); f = g.getFlaeche(); }

// f=52

// 52=2(2*3+2*4+3*4)

Merke:Wenn die Methode in mehreren Klassen einer Vererbungshierarchie vorkommt, wird auf die in der Vererbungshierarchie am weitesten unten stehende Methode zugegriffen. Also:

Wenn die Methode in der Unterklasse und in der Oberklasse vorkommt wird auf die Methode der ...

Wenn die Methode in der Unterklasse, aber nicht in der Oberklasse vorkommt wird auf die Methode ...

Unterklasse zugegriffen

Unterklasse zugegriffen

Wenn die Methode nicht in der Unterklasse, aber in der Oberklasse vorkommt wird auf die Methode ... Oberklasse zugegriffen

Page 50: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

double getFlaeche(){ return(2*(h*getB()+h*getL()+ getL()*getB()));} getFlaeche könnte man auch

anders implementieren ...double getFlaeche(){ double temp; temp= h*getL() + h*getB(); temp=2*(super.getFlaeche()+temp); return(temp);} Mit super ruft man die verdeckte Methode

der Oberklasse auf, wobei super nicht die erste Anweisung in der Methode sein muss.

Page 51: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

Der Zugriffschutzprotected

Page 52: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

Zuerst ein kleiner Ausflug

Page 53: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

Ein package (deutsch Paket) ist ein besonderes Verzeichnis (auf der Festplatte), in dem sich eine Menge von "zusammengehörigen" Klassen (ähnlich einer Programmbibliothek) befindet. Diese Klassen sind in einer (wir haben bis jetzt immer nur eine java-Datei verwendet) oder mehreren Java-Dateien (mit der Endung "java") gespeichert. Unterhalb dieses Verzeichnisses müssen sich diese o.g. Java-Dateien befinden. Ein package wird dadurch gekennzeichnet, dass in der 1. Zeile der Bezeichner package steht, wie z.B:package myPaket;

Page 54: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

Wenn der Bezeichner package nicht angegeben wird, wird automatisch (ohne Zutun des Programmierers) ein spezielles package angelegt: Das Default package Das Default package ist das aktuelle Verzeichnis.

Professionelle Entwickler verwenden kein Default package (es wird davon abgeraten), weil z.B. Klassen aus anderen Packages als dem Default Package nicht auf das Default Package zugreifen können.

Page 55: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

Spezifiziererin gleicher

Klasse

in Unterklasse

mit Vererbung

in gleichem Package

überall

private ja nein nein nein

protected ja ja ja nein

public ja ja ja janichts

angegeben ja nein ja nein

ja: Zugriff möglichnein: Zugriff nicht möglich

AUFGABE:Machen Sie in Netbeans ein Beispiel mit:protected, in Unterklasse mit Vererbung,

nicht im gleichen package

Page 56: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

Ende des Ausflugs. Weitere, ausführlichere Infos zu packages,

siehe Java-Skript auf meiner Website: www.umaterialien.de

Page 57: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

class Gmodell extends Modell{ private double h; public Gmodell(double pl, double pb, double ph){ super(pl,pb); setH(ph); }

public void setH(double ph){ h = ph; }

public double getH(){ return(h); }

public double getVolumen(){ return(b*l*h); }}

Wiederholung:Warum ist diese Lösung falsch ?

Die Member b und l gibt es zwar in der Klasse Gmodell (sie wurden vererbt). Allerdings sind sie private. Auf vererbte private-Member kann weder innerhalb noch außerhalb der Unterklasse zugegriffen werden.

Page 58: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

class Gmodell extends Modell{ private double h; public Gmodell(double pl, double pb, double ph){ super(pl,pb); setH(ph); }

public void setH(double ph){ h = ph; }

public double getH(){ return(h); }

public double getVolumen(){ return(b*l*h); }}

Was muss man machen, damit diese Lösung funktioniert?

Eine Möglichkeit wäre, b und l der Oberklasse public zu machen. Dann könnte man auch von innerhalb einer Methode der Unterklasse auf diese vererbten Member zugreifen.Welchen Nachteil hätte dies aber?

Man könnte auch von außerhalb einer Methode auf die Attribute b und l zugreifen. Das widerspricht der Philosophie der objektorientierten Programmierung.

Page 59: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

class Gmodell extends Modell{ private double h; public Gmodell(double pl, double pb, double ph){ super(pl,pb); setH(ph); }

public void setH(double ph){ h = ph; }

public double getH(){ return(h); }

public double getVolumen(){ return(b*l*h); }}

In der Oberklasse kann man den Zugriffsschutz von b und l (der bisher private war) auf protected setzen. Damit kann man auch von innerhalb einer Methode der Unterklasse auf diese vererbten Member zugreifen.

Von außerhalb einer Methode kann man (bei protected) nicht mehr auf die Attribute b und l zugreifen, außer...

die Klasse (hier: MainVererbung1) von der aus auf das protected - Attribut einer anderen Klasse (hier: Modell oder Gmodell) zugegriffen wird, befinden sich im gleichen Package (Default package). Da das bisher bei uns der Fall war, unterscheiden sich public und protected nicht.

Page 60: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

public class MainVererbung1{ public static void main(String[] args){ Modell m = new Modell(10,20); Gmodell g = new Gmodell(2,3,4); double x1, x2; x1 = m.l; m.b = 5; x2 = g.l; g.b = 13;; }}class Modell{ protected double l; protected double b; // Rest wie früher} // class Gmodell wie früher

Wann funktionieren diese Zugriffe von außerhalb nur?

MainVererbung1, Modell oder Gmodell sind im gleichen Package.

Page 61: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

Darstellung der Vererbung durch UML

Page 62: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

Basisklasse...

...

Subklasse...

...

Attribute

Methoden

Attribute

Methoden

Pfeil bedeutet: erbt von

Analog zum Zugriffsschutz+ (public) und– (private) bedeutet # : protected

Page 63: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

Aufgabe:

Stellen Sie die Klassen Modell, Gmodell und ihre Vererbungshierarchie in UML dar.

Page 64: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

Modell - l: double - b: double + Modell(pl:double, pb:double) + setL(pl:double): void + setB(pb:double): void + getL():double + getB():double + getFlaeche():double

Gmodell - h: double + Gmodell(pl:double, pb:double, ph:double) + setH(ph:double): void + getH():double + getVolumen():double

Statt dem Zugriffschutz + oder - kann auch der Zugriffschutz # benutzt werden, also ...

Page 65: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

Modell # l: double # b: double + Modell(pl:double, pb:double) + setL(pl:double): void + setB(pb:double): void + getL():double + getB():double + getFlaeche():double

Gmodell - h: double + Gmodell(pl:double, pb:double, ph:double) + setH(ph:double): void + getH():double + getVolumen():double

Page 66: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

Wann soll man eine Vererbung sinnvoll

einsetzen ?

Page 67: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

wenn die folgende Beziehung besteht:

Subklasse "ist ein(e)" Basisklasse.

Im Gegensatz zu einer Aggregation. Dort besteht die

Beziehung "hat" bzw. "besteht aus"

Page 68: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

Beispiele der Vererbung:Ein LKW ist ein FahrzeugEine Katze ist ein TierEine Tulpe ist eine Pflanze

abgeleitete Klasse

Basisklasse

Page 69: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

Der Prozeß, um von einer Basisklasse durch Detaillierung und Konkretiserung zu einer Subklasse zu kommen, nennt man Spezialisierung.

Der Prozeß, um von einer Subklasse durch Verallgemeinerung und Abstraktion zur Basisklasse zu kommen, nennt man Generalisierung.

Page 70: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

Parameterübergabe und Konvertierung

Page 71: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

I) Wenn eine Methode verlangt, dass ein Parameter einen primitiven Datentypen wie z.B. double haben muss, aber beim Methodenaufruf ein integer Wert benutzt wird, dann wird der "kleinere" Datentyp (hier also int) automatisch in den "größeren" Datentyp konvertiert (impliziter cast).

Page 72: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

Beispiel (siehe Klasse Hund):Es soll der Hund Bello mit 10.5 Kg

Gewicht erzeugt werden.Anschließend soll dieses Gewicht

auf 15 Kg abgeändert werden (Hund hat zugenommen).

Page 73: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

public class MainKlassen1 { public static void main(String[] args){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(10.5); myh1.setGewicht(15); }}

class Hund{ // wie vorher}

10.5 ist ein Literal und hat den Datentyp double. Laut der Deklaration der Methode setGewicht(...) muß er auch diesen Datentyp haben.

Welchen Datentyp hat dieser aufrufende (aktuelle) Parameter und welchen Datentyp müsste er laut Deklaration der Methode setGewicht(...) haben?

Page 74: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

public class MainKlassen1 { public static void main(String[] args){ Hund myh1; myh1=new Hund(); myh1.setName("Goldi"); myh1.setGewicht(10.5); myh1.setGewicht(15); }}

class Hund{ // wie vorher}

15 ist ein Literal und hat den Datentyp integer. Laut der Deklaration der Methode setGewicht(...) müsste er aber den Datentyp double haben.

Der Compiler müsste also streng genommen eine Fehlermeldung bringen ....

Er macht dies allerdings nicht, sondern wandelt automatisch den „kleineren“ Datentyp integer (also konkret 15) in den „größeren“

Datentyp double (also konkret 15.0) um!

Welchen Datentyp hat dieser aufrufende (aktuelle) Parameter und welchen Datentyp müsste er laut Deklaration der Methode setGewicht (...) haben?

Page 75: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

II) a) Wenn eine Methode verlangt, dass ein Parameter als Datentyp eine Klasse haben muss, aber beim Methodenaufruf ein Objekt einer Unterklasse davon übergeben wird, dann wird das Objekt vor der Übergabe an den Parameter automatisch in das Objekt der Oberklasse konvertiert (impliziter cast).

Page 76: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

b) Umgekehrt geht es nicht:Ein Objekt einer Oberklasse kann nicht an einen Parameter einer Methode übergeben werden, die ein Objekt einer Unterklasse erwartet.

Page 77: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

Beispiel(Klasse Modell und GModell

wie im früheren Beispiel)

Page 78: Vererbung. Das Prinzip der Vererbung im täglichen Leben:

package parameteruebergabe1;public class MainParameter1 { public static void main(String[] args){ Modell m = new Modell(10,20); Gmodell g = new Gmodell(2,3,4); changeLaenge(m, 20); changeLaenge(g, 40); System.out.println(m.getL()); System.out.println(g.getL()); }

public static void changeLaenge( Modell pModell, double pl){ double tempLaenge; tempLaenge = pModell.getL(); pModell.setL(tempLaenge+pl); }}

welchen Datentyp (Klasse) muß diese Variable haben und warum?

Die Methode changeLaenge verlangt den Datentyp Modell

Warum ist dann dieser Aufruf richtig?

Weil g automatisch in das Objekt von Datentyp Modell konvertiert wird.

Warum muß hier static stehen?Dies wird später behandelt!