Instanz einer Subklasse anhand deren Superklasse

Diluvian

Mitglied
Hallo zusammen,
Ich bin mir leider nichtmal sicher ob ich nun die Frage richtig stelle. Es ist folgender Fall gegeben:

Java:
SuperKlasse object = new SubKlasse();

Wieso macht man das? Wenn man die Thematik beigebracht bekommt (Bücher, Online), sieht man die für mich aktuell noch logischere Variante:

Java:
SubKlasse object = new SubKlasse();

Ich hab nun eine Weile gesucht :rtfm: und leider keine Antwort darauf gefunden. Vielen Dank euch also schonmal für die Hilfe!
 

Saheeda

Top Contributor
Weil man so seinen Code flexibler/dynamischer gestalten kann. Man weiß nicht immer bereits während des Programmierens, welche Typen letzten Endes wirklich benutzt werden.

Vielleicht mal ein paar Beispiele aus Übungsprojekten von mir:
Java:
class Operation{}

class Addition extends Operation{}

class Subtraction extends Operation{}

public static Operation getOperation(String sign){
    	
    	Operation searched = null;
    	switch(sign){
    		case "+":
    			searched = new Addition();
    			break;
    		case "-":
    			searched = new Subtraction();
    			break;
                [...]
    	}
    	
    	return searched;
    }



oder :

Java:
public class Service
{	
	private BaseDao dao;

       public Service(BaseDao dao){
             this.dao = dao;
       }    
}

class BaseDao{}

class UserDao extends BaseDao{}
Dao = greift direkt auf die Datenbank zu

Ich weiß hier während des Programmierens nur, dass mein Service mal irgendeine Form von Dao brauchen wird, kann/möchte mich aber noch nicht so genau festlegen, welcher Dao es mal wird. Die Alternative hierzu wäre, für jeden potentiellen Dao einen eigenen Konstruktor zu generieren, was bei 2-3 Kandidaten noch machbar ist, aber bei mehr ganz schnell lästig wird.


Man versucht, Code so allgemein wie möglich, aber so spezifisch wie notwendig zu schreiben. Indem du dich nicht genau festlegst, lässt du dir mehr Optionen offen und das Risiko sinkt, dass du bei späteren Ergänzungen erneut zig Klassen anfassen musst.
Besonders bei der Definition von Interfaces ist das relevant.


Oder Beispiel ausm echten Leben:
"Mir egal, was es gibt, Hauptsache Pizza!"
;-)
 

Chisao

Mitglied
Hier auch ein gutes Beispiel:
Du hast 5 Objekte. "Boot", "Motorrad", "Auto", "LKW", "Flugzeug". Nun hat jedes dieser Objekte einen spezifischen Preis. Jetzt will man eine unbestimmte Anzahl von diesen Objekten mit einer Funktion:
Java:
public float kaufen(Boot[] boote, Motorrad[] motorräder, Auto[] autos, LKW[] lkws, Flugzeug[] flugzeuge){
float preis;
for(Boot b:boote){
preis+=b.getPreis();
}
for(Motorrad m:motorräder){
preis+=m.getPreis();
}
for(Auto a:autos){
preis+=a.getPreis();
}
for(LKW l:lkws){
preis+=l.getPreis();
}
for(Flugzeug f:flugzeuge){
preis+=f.getPreis();
}
return preis;
}

Wie man sieht ist die ganze Methode seeeeehr aufgebläht. Und jetzt kommt die Vererbung ins Spiel:
Jetzt haben wir noch eine Klasse "Fahrzeug" und lassen alle unsere Objekte davon erben. In diese Klasse Fahrzeug geben wir jetzt noch unsere getPreis Funktion. Jetzt sind alle unsere Objekte Fahrzeuge, und jedes Fahrzeug hat laut unserer Definition einen Preis welchen wir abfragen können. Nun können wir die Funktion deutlich vereinfachen:
Java:
public float kaufen(Fahrzeug[] fahrzeuge){
float preis;
for(Fahrzeug f:fahrzeuge){
preis+=f.getPreis;
}
return preis;
}

Hast jetzt den Anwendungszweck anhand des Beispieles verstanden :)?
 

Diluvian

Mitglied
Vielen dank für eure Ausführliche Erklärung, das hat mir sehr geholfen! Einen Nachteil sehe ich aktuell jedoch (zumindest bis jetzt): Man muss auf diesem Wege immer mit Downcasts arbeiten, wenn man auf spezielle Methoden der Subklasse zugreifen möchte. Kann das nicht verwirrend sein? Selbst wenn ich vorher "instanceof" abfrage, würde er bei dem Instanz vom Typ der Superklasse sowie bei der Subklasse "true" zurück werfen und ich wüsste nicht, ob ich nun ein Instanzobjekt von der Superklasse oder der Subklasse vor mir habe (klar, meine programmierumgebung würde mir dabei unter die Arme greifen).

Generell habe ich es aber verstanden. Wirklich sehr vielen Dank!
 

Saheeda

Top Contributor
Vielen dank für eure Ausführliche Erklärung, das hat mir sehr geholfen! Einen Nachteil sehe ich aktuell jedoch (zumindest bis jetzt): Man muss auf diesem Wege immer mit Downcasts arbeiten, wenn man auf spezielle Methoden der Subklasse zugreifen möchte. Kann das nicht verwirrend sein?
Du hast vollkommen Recht, dass man einen Downcast braucht, um spezielle Methoden der Unterklasse abzufragen. Der Sinn einer Vererbungshierarchie ist ja aber gerade, so viele Gemeinsamkeiten wie möglich zusammenzufassen. Dementsprechend sollten solche Downcasts eher die Ausnahme, als die Regel sein.


Selbst wenn ich vorher "instanceof" abfrage, würde er bei dem Instanz vom Typ der Superklasse sowie bei der Subklasse "true" zurück werfen und ich wüsste nicht, ob ich nun ein Instanzobjekt von der Superklasse oder der Subklasse vor mir habe (klar, meine programmierumgebung würde mir dabei unter die Arme greifen).


Java:
class Animal{
 
    void move(){}  
}

class Cat extends Animal{

  void meow(){}

}

class Dog extends Animal{

  void bark(){}

}

                Animal a = new Animal();
                Animal c = new Cat();
		Animal d = new Dog();
		
                System.out.println(a instanceof Animal); //true
		System.out.println(a instanceof Cat); //false

		System.out.println(c instanceof Cat); //true
		System.out.println(c instanceof Animal); //true
		
		System.out.println(d instanceof Dog); //true
		System.out.println(d instanceof Cat); //false

Du kannst mit instanceof differenzieren zwischen Dog- und Cat-Objekten und somit dein Objekt x explizit casten und damit auf die spezifischen Methoden zugreifen.
"Cat" hat sowieso alle Methoden der Animal-Klasse, also ist es mir ziemlich Schnuppe, ob beim Aufruf von c.move() die Methode eine "eigene" ist oder von Animal geerbt wurde. Wenn Cat eine spezielle move-Implementierung benötigt, überschreibe ich diese Methode einfach in der Cat-Klasse.
 

Diluvian

Mitglied
Das mit dem Methoden-Überschreiben weiß ich, mir war nur nicht bewusst, dass instanceof so differenziert. Vielen dank dafür. Meine Fragen sind damit aktuell alle geklärt :).

Grüße!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
frager2345 Singleton-Muster Java ->Nur eine Instanz einer Klasse erzeugen können Java Basics - Anfänger-Themen 45
O Wie erstelle ich eine Instanz in einer Klasse für die ich die Instanz will? Java Basics - Anfänger-Themen 4
T Inhalt aus TextField in Attribut einer Instanz schreiben Java Basics - Anfänger-Themen 5
I Instanz einer anderen Klasse zurückgeben Java Basics - Anfänger-Themen 34
F Mehrere Instanzen der Klasse A EINER Instanz der Klasse B übergeben Java Basics - Anfänger-Themen 3
F OOP Instanz einer Klasse an eine andere weitergeben Java Basics - Anfänger-Themen 16
C Instanz einer Klasse während if-Abfrage erzeugen und bei zweiter if-Abfrage wiederverwenden Java Basics - Anfänger-Themen 6
T Auf Instanz einer Liste zugreifen Java Basics - Anfänger-Themen 2
P Instanz mit .add Methode von einer Klasse zur anderen? Java Basics - Anfänger-Themen 6
K Zugriff auf Variabeln Wert einer Instanz Java Basics - Anfänger-Themen 4
O OOP Methoden bei erstellen einer Instanz und mehr Java Basics - Anfänger-Themen 4
S Methoden eine Instanz einer eigenen Klasse als parameter übergeben Java Basics - Anfänger-Themen 9
kaoZ Android Programmierung / Erstellen einer neuen Instanz Java Basics - Anfänger-Themen 2
M Initialisierungsblock beim Erzeugen einer Instanz Java Basics - Anfänger-Themen 6
C Klassen Zugriff auf Instanz einer anderen Klasse Java Basics - Anfänger-Themen 9
F Array als Instanz einer Klasse Java Basics - Anfänger-Themen 8
P Klassen Instanz einer Klasse in ihrer eigenen Definition erzeugen? möglich? Java Basics - Anfänger-Themen 4
K Methoden Zustand innerhalb einer Instanz ändern Java Basics - Anfänger-Themen 2
pindakaas Instanz einer Klasse in einer anderen erzeugen Java Basics - Anfänger-Themen 6
B Daten in Instanz einer Klasse ändern / abfragen Java Basics - Anfänger-Themen 12
A Instanz einer Klasse Java Basics - Anfänger-Themen 2
S Instanz(en) einer Singleton-Klasse Java Basics - Anfänger-Themen 11
D Wie neue Instanz einer Klasse erstellen, von der ich nur eine andere Instanz kenne? Java Basics - Anfänger-Themen 13
G Name der Instanz einer Klasse. Java Basics - Anfänger-Themen 2
G Was passiert mit eine Methode bei einer Instanz Java Basics - Anfänger-Themen 13
D vererbung, kinder einer instanz. Java Basics - Anfänger-Themen 25
G Vererbung mit einer Instanz aus der Superklasse Java Basics - Anfänger-Themen 2
B Sortieren von Objekt Arrays nach einer Instanz Java Basics - Anfänger-Themen 8
D Instanz einer Klasse in einer anderen klasse erzeugen Java Basics - Anfänger-Themen 3
S will instanz einer Klasse erzeugen - mach irgendwas falsch Java Basics - Anfänger-Themen 6
P Instanz in einer Variable speichern ? Java Basics - Anfänger-Themen 4
H Instanz einer Klasse übergeben und dynamisch auswerten Java Basics - Anfänger-Themen 3
S Einfach-Verkettete-Listen Ausgabe zeigt nur 1. und letzte instanz Java Basics - Anfänger-Themen 2
H String Repräsentation eines Rechtecks mit Instanz-Methode Java Basics - Anfänger-Themen 8
O Mit Instanz von Oberklasse auf Unterklasse zugreifen Java Basics - Anfänger-Themen 2
T Auf Instanz der selben Klasse aus überschriebener Methode in Methode zugreifen. Java Basics - Anfänger-Themen 2
F Wann ist es eine Instanz und wann nicht? Java Basics - Anfänger-Themen 1
Kirby.exe Generische Objekt Instanz erstellen Java Basics - Anfänger-Themen 14
M Java Instanz-Variablen ? Java Basics - Anfänger-Themen 3
G Unterschied Instanz- Klassenvariable Java Basics - Anfänger-Themen 11
C Group, Actor und Instanz-Zugriff, LibGDX Java Basics - Anfänger-Themen 4
BadBat Klassen instanz als variable + methodenaufruf Java Basics - Anfänger-Themen 4
M Neu instanzierte Klasse übernimmt Werte von anderer Instanz Java Basics - Anfänger-Themen 4
H Klassen Von Instanzvariablen auf Instanz schließen Java Basics - Anfänger-Themen 21
W Methoden Methode ohne Parameter auf Instanz eines Objekts aufrufen? Java Basics - Anfänger-Themen 14
J Variablen Unterschied zwischen lokalen-, Instanz-, Klassenvariablen Java Basics - Anfänger-Themen 6
T Junit Mockito: Instanz von inneren erzeugten Objekten Java Basics - Anfänger-Themen 4
S Klassen Instanz anderer Klasse raus geben Java Basics - Anfänger-Themen 1
B Klassen Auf Instanz anderer Klasse zugreifen Java Basics - Anfänger-Themen 1
U JavaFX eine Vbox Instanz pro Pane? Java Basics - Anfänger-Themen 2
S Wann existiert eine Instanz (eigene Klasse) Java Basics - Anfänger-Themen 8
E Von Instanz des Dialogs auf das Frame zugreifen Java Basics - Anfänger-Themen 8
B Variablen Instanz von Enum zur Laufzeit erstellen und zuweisen Java Basics - Anfänger-Themen 2
G Undefined Instanz/Konstruktoraufruf Java Basics - Anfänger-Themen 8
S Ein Attribut/Instanz eines bestehendes Objektes mit SETTER Methode ändern Java Basics - Anfänger-Themen 3
J Instanz durch String Java Basics - Anfänger-Themen 8
U final Instanz Java Basics - Anfänger-Themen 11
O Erste Schritte Klassenname zurückgeben, keine instanz Java Basics - Anfänger-Themen 23
0 Log4J Instanz erzeugen Java Basics - Anfänger-Themen 2
B Geerbte Instanz kann keine void Methode ausführen?! Java Basics - Anfänger-Themen 15
L Instanz Problem Java Basics - Anfänger-Themen 4
E ActionListener erkennt instanz nicht Java Basics - Anfänger-Themen 9
M JRadioButton keine Instanz von ButtonModel Java Basics - Anfänger-Themen 10
S OOP Warum gleiche Instanz der Klasse? (Factory-Muster) Java Basics - Anfänger-Themen 13
O zugriff auf eine Instanz Java Basics - Anfänger-Themen 8
U Instanz aufrufen Java Basics - Anfänger-Themen 3
A Stilfrage: statische Variable mit Instanz der gleichen Klasse Java Basics - Anfänger-Themen 8
Antoras eine Instanz von mehrere Klassen aus nutzen Java Basics - Anfänger-Themen 2
D Servlet kann nicht auf Instanz zugreifen Java Basics - Anfänger-Themen 10
G neue Instanz von ArrayList Java Basics - Anfänger-Themen 5
W IE Instanz öffnen / Ausführbare Datei öffnen Java Basics - Anfänger-Themen 2
D Bei Event soll Instanz sich selbst löschen Java Basics - Anfänger-Themen 4
J Generics Probleme mit instanz von T Java Basics - Anfänger-Themen 4
H OO-Anfänger: mehrere Klassen greifen auf eine Instanz zu Java Basics - Anfänger-Themen 9
H instanz von Button wird nicht erkannt! Java Basics - Anfänger-Themen 6
P Instanz mit allen Attributen ausgeben Java Basics - Anfänger-Themen 3
E Eine Klasse hat eine Instanz von sich selbst. Java Basics - Anfänger-Themen 6
W zugriff auf jframe klasse und deren instanz geht nicht? Java Basics - Anfänger-Themen 11
G Instanz-Rückgabewerte abspeichern Java Basics - Anfänger-Themen 2
F Socket Instanz auf Klasse welche von Socket erbt zuweisen Java Basics - Anfänger-Themen 3
I In Instanz ausgeben wer sie erzeugt hat Java Basics - Anfänger-Themen 2
F nur 1 Instanz 1 Klasse --> static? Java Basics - Anfänger-Themen 10
P Instanz kann nicht erstellt werden. Java Basics - Anfänger-Themen 2
M Von Instanz auf instanzierende Klasse zugreifen Java Basics - Anfänger-Themen 5
S paintComponent, neue Instanz überschreibt wohl alte Instanz Java Basics - Anfänger-Themen 6
D Instanz von Graphics in run() Java Basics - Anfänger-Themen 8
J generische klassen neue Instanz Java Basics - Anfänger-Themen 5
P Zugriff auf Instanz in der anderen Klasse geht nicht! Java Basics - Anfänger-Themen 4
N Objekt seine eigene Instanz löschen lassen? Java Basics - Anfänger-Themen 7
T neue Instanz von JFileChooser => applikation friert ein Java Basics - Anfänger-Themen 2
D Unterschied zwischen Referenz auf Objekt/Instanz von Objekt Java Basics - Anfänger-Themen 9
F Prüfen, ob Instanz existiert Java Basics - Anfänger-Themen 14
J Brett vorm Kopf - Klasse aufrufen/instanz *?* Java Basics - Anfänger-Themen 11
M Methoden oder Instanz statisch? Java Basics - Anfänger-Themen 7
H eindeutige Instanz erzeugen Java Basics - Anfänger-Themen 4
M Ausgabe einer ArrayList ensteht nur als Hashcode, nicht als Objekt Java Basics - Anfänger-Themen 16
D 2 ArrayListen gleich sortieren bzw. eine Liste anhand einer anderen Sortieren Java Basics - Anfänger-Themen 6
ixChronos Letzten 4 Ziffern einer großen Zahl ausgeben Java Basics - Anfänger-Themen 3
P Objekt einer Methode eines anderen Objektes übergeben Java Basics - Anfänger-Themen 5
L Variablenwerte aus einer Methode übergeben Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben