# Java - Vererbung



## GiZZy (16. Jul 2007)

Hallo PRG-junkies,

hab erst vorkurzem angefangen, mit java zu programmieren, und es geht um folgende Aufgabe: Jeder Tipp, Rat würd mir weiter helfen: 

Gegeben sei eine Oberklasse O. Eine Unterklasse U erbt (extends) die Oberklasse O. 


```
Oberklasse o = new Oberklasse();
Unterklasse u = new Unterklasse();
```

Welche der nachfolgenden Ausdrücke sind erlaubt, welche nicht.

a) o = u;
b) u = o; 
c) u = new Oberklasse(); 
d) o = new Unterklasse();

zu a.) Oberklasse o erbt Unterklasse u. Eigentlich sollte dass nicht erlaubt sein, da die Unterklasse die Werte der Oberklasse annimmt.

zu. b.) Unterklasse u erbt Oberklasse o. Das sollte erlaubt sein, da es definiert ist, dass u die Werte von o erbt.

zu. c.) u erhält eine neue Zuordnung. u wird als oberklasse definiert, d.h. dieser Ausdruck sollte erlaubt sein, da u nun mit den vorgegeben Werten von o non eune neue Oberklasse bilden kann.

zu. d.) Nun wird o als eine neue unterklasse definiert. Ich würd sagen, dass das nicht erlaubt sei, da es wohl nicht wirklich kompatibel wäre mit der schon vorhandenen Unterklasse u. 


Kann sein, dass es alles Müll ist was ich da jetzt hingekritzelt habe, aber aus dem vorgegeben Skript find ich nix, womit ich diese Aufgabe lösen könnte. 


Wie gesagt: Würd mich freuen, wenn mir jemand etwas helfen würde.

Danke und grüße

der olle GiZZy


----------



## Marco13 (16. Jul 2007)

Ja nun naja - hm - "nicht ganz". Vielleicht ist es nur ein Mißverständnis wegen der Begrifflichkeiten. "Extends" heißt "erweitert" (oder "erbt *von*"). Das heißt aber nicht, dass da irgendwelche Werte, die vorher nicht da waren, auf einmal vorhanden sind. (Ich bin nicht sicher, wie du das meintest...). Vielleicht hast du das "vererben" auch auf Objekte bezogen, und nicht auf Klassen. 

Die Unterklasse erbt die Werte von der Oberklasse. Aber die Unterklasse ist MEHR als die Oberklasse. Die Beziehung kann man beschreiben als "Jedes *Unterklasse* ist auch ein *Oberklasse*"
Vielleicht mal ein Beispiel:

```
class Fahrzeug 
{ 
    int räder;
    void fahre() {...}
}
class Auto extends Fahrzeug 
{ 
    // "räder" und "fahre" werden geerbt. ZUSÄTZLICH gibt es aber noch einen...
    Motor motor; 
}
```
Die Beziehung ist jetzt:
"Jedes *Auto* ist auch ein *Fahrzeug*"
(umgekehrt gilt das nicht!)

Wenn man nun machen würde

Fahrzeug o = ... (irgendein Fahrzeug - vielleicht ein Auto - oder ein Fahrrad)...
Auto u = new Auto();

// Frage a:
o = u; 
// Die Variable 'o' beschreibt ein Fahrzeug. Also kann sie auch ein Auto beschreiben.

// Frage b:
u = o; 
// Die Variable 'u' beschreibt ein Auto. Aber nicht jedes Fahrzeug ist ein Auto!
// Vielleicht war 'o' ja ein Fahrrad. Das ist auch ein Fahrzeug. Aber nur dadurch,
// dass man dieses Objekt dann einer "Auto"-Variablen zuweist, wird kein 
// Auto daraus. Man könnte dann ja auf
// u.motor
// zugreifen - obwohl das Fahrzeug 'o' in Wirklickeit ein Fahrrad ist!


Hm. Vielleicht kann es noch jemand besser erklären.


----------



## Murray (16. Jul 2007)

GiZZy hat gesagt.:
			
		

> zu a.) Oberklasse o erbt Unterklasse u. Eigentlich sollte dass nicht erlaubt sein, da die Unterklasse die Werte der Oberklasse annimmt.



In der Aufgabenstellung steht es genau umgekehrt: U extends O (seltsam finde ich allerdings, dass im gegebenen Code dann wieder von Oberklasse und Unterklasse die Rede ist anstatt von O und U).

Mit dieser Definition gilt: jede Instanz der Klasse U ist automatisch auch Instanz der Klass O.

Also:
a) o = u;  //-- geht, da U E einschließt
b) u = o; //-- geht nicht, da U eine Spezialisierung von O ist
c) u = new Oberklasse(); //-- geht nicht; siehe b)
d) o = new Unterklasse();  //-- geht; siehe a)


----------



## ARadauer (26. Jul 2007)

stimmt, a und d

genau Fahrzeug = Auto

oder ich verwend gerne Tiere als Beispiel für die vererbung. 
Tier = oberklasse
Hund extends Tier
Katze extends Katze

Tier hund = new Hund();
Tier katze = new Katze();

dann hat zb Tier die methode gibLaut(), die Katze und Hund überschreiben, dann kannst sowas nettes machen

Tier[] tiere = new Tier[2];
tiere[0] = hund;
tiere[1] = katze;

for(int i=0; i < tier.lenght;i++){
    sysout(tiere_.gibLaut();
}

und dann bellts und miauts, je nach dem. polymorphismus und dynamische bindung, gscheid geil!

(oder so ungefähr)_


----------

