Nun der Vorteil hierbei ist, durch die Polymorphie bedingt, Codeteile leicht austauschen kannst.
Java:
List<String> liste =newArrayList<String>();List<String> liste =newLinkedList<String>();
Weiterer Vorteil ist, dass alle Methoden des deklarierten Types vorhanden sind. So kannst du, in deinem Beispiel, alle Methoden aufrufen, die du an Tier aufrufen kannst. Nehmen wir mal an, du das Tier ist ein Haustier und du willst dann wissen, was das Tier frisst. Wenn du weißt, dass da ein Objekt existiert, dass von Tier erbt (Hund), dann kannst du ja sichergehen, dass der Hund alle Methoden hat, die auch Tier hat (Vererbung). Wenn du also auf der Variable Tier die Methode "gibGeeigneteNahrung()" hättest, dann würde diese dann eben zurückgeben, was der Hund fressen würde.
Wenn du keine Vererbung nutzen könntest, dann müsstest du für jeden Tiertyp (Hund, Katze, Schlange,...) jeweils eine Variable haben und JEDE überprüfen, ob dort ein Tier vorhanden ist.
Vererbung nutzt man eben genau dann, wenn man a) etwas aus der Welt modellieren will oder wenn es es eben ein "Grundgerüst" gibt, das andere Klassen auch haben müssen z.B. alle Tiere müssen eben haben: Gesundheitszustand, Geschwindigkeit, Alter, etc und Methoden wie #gibGeeigneteNahrung, istMüde, etc.
schreibst, dann kann die Variable Hund kein Objekt des types Katze mehr aufnehmen.
Du hättest zwar alle Methoden von Tier und dazu noch die, die Hund zusätzlich anbietet, aber da keine direkte, lineare Verebungsherachie zwischen Katze und Hund besteht, kannst du nicht sicher sagen, dass Katze und Hund die selben Methoden haben.
Ich glaube ich verstehe so langsam was ihr meint, aber das Beispiel würde locker nicht den ist-ein-Test bestehen(nur so am Rande).
Kern des ganzen ist also eine erhöhte Flexibilität.
Natürlich würde es dass. Hund ist ein Tier, Katze ist ein Tier.
Die semantische Bedeutung der Variable kaefig ist: ein Tier im Käfig.
Somit ist Hund ein Tier im Käfig, Katze ein Tier im Käfig...
Also alles völlig korrekt. Einzig der Variablenname ist unglücklich gewählt.
drückst du aus, das dich die Eigenschaften vom Hund (bellt wie laut?, sabbert wie viel, ...) nicht interessieren, sondern nur die Eigenschaften, die es als Tier hat (Gewicht, haarig, ...)
Man nimmt immer den kleinsten nötigen Typ, natürlich schreibst du
Hund tier = new Hund();
wenn du brauchst, was ein Hund eben vom allgemeinen Tier unterscheidet.