Variablen Instanziierung

eldok

Mitglied
Ein kleines Beispiel:

Ich habe eine Klasse Tier und 2 Subklassen Hund, Katze, die von der Klasse Tier erben.
Oft sehe ich dann, dass ein neuer Hund oder Katze mit Tier angelegt wird. Also:
Tier tier1=new Hund(); Wieso nicht Hund tier1=new Hund()?

Anfangs dachte ich, es geht ums filtern. Wenn ich also eine ArrayList anlege und ich dann sowohl Katzen als auch Hunde aufnehmen kann mit Generic-Typ Tier. Habe ein wenig herumgespielt, solange ich bei Katze und Hund eine extends einfüge, kann ich die Subklassen auch so in mein ArrayList einfügen.
Beim durchiterieren wird dann auch die entsprechende methode lautGeben(); aufgerufen.
 

httpdigest

Top Contributor
Also erstmal: Was du ansprichst, ist ganz einfaches Subtyping/Subklassing bzw. Vererbung.
Du kannst generell einer Variablen vom Supertyp einen Wert eines davon abgeleiteten Subtypen zuweisen.
Die Verwendung eines Supertypen anstelle der ganz konkret an dieser Stelle instanziierten Klasse ist zumindest hier bei dem Beispiel der Variable diskutable, weil bringt effektiv keinen Vorteil.
Aber... wenn es sich dabei z.B. nicht um eine Variablendeklaration handelt, sondern um einen Parameter einer Methode, dann möchtest du den Typen des Parameters so allgemein/generisch wie möglich halten.
Im Allgemeinen sollten Typen von Variablen, Parametern und Feldern immer nur so konkret wie nötig und so allgemein wie möglich sein. Allgemeinheit hat den Vorteil, dass du den Code seltener refactoren/ändern musst, wenn du z.B. die Methode nicht mehr mit einer ArrayList, sondern einer LinkedList aufrufst, und es der Methode egal ist, ob sie das eine oder das andere bekommt.
 

eldok

Mitglied
Erstmal vielen Dank für die Antwort.

Aber.. Ich habe eine Methode erstellt, die als Parameter eine Instanz meiner Superklasse verlangt, hier also Tier. Kann aber dennoch einen Hund instanziieren und ihn als Parameter übergeben, solange er von Tier erbt, also "normal" als Hund;

Hund hund1=new Hund();

tierAusgeben(hund1);

public void tierAusgeben(Tier tier){
Sysout(tier);
}
 

mihe7

Top Contributor
Aber.. Ich habe eine Methode erstellt, die als Parameter eine Instanz meiner Superklasse verlangt, hier also Tier. Kann aber dennoch einen Hund instanziieren und ihn als Parameter übergeben, solange er von Tier erbt, also "normal" als Hund;

Ja, weil durch das "extends" die Beziehung Hund ist-ein Tier gilt.

Um zur weiteren Verwirrung beizutragen ;)
Code:
void objektAusgeben(Object o) {
    System.out.println(o);
}
Dieser Methode kannst Du eine Instanz von Hund, Katze, Tier, ... übergeben :eek:
 

Ähnliche Java Themen

Neue Themen


Oben