Polymorphie Objektreferenz als Superklasse anstatt des Objekttypes

Kel

Aktives Mitglied
Man kann ja schreiben (Obst ist Superklasse)
Code:
Obst apfel = new Apfel()

oder man schreibt
Code:
Apfel apfel = new Apfel()

In beiden Fällen erhält man ein Objekt vom Typ
Code:
Apfel
, beim ersten Beispiel ist die Objektreferenz aber die Superklasse.
Wofür ist das so allgemein gut? Bisher hab ich Arraylisten kennengelernt, welche ja
1. nur Objekte annehmen
2. welche man mit Polymorphie allgemein halten kann, so dass man nur eine Arrayliste für den Objekttyp
Code:
Obst
erzeugen muss und nicht für jede Obstsorte eine eigene.

Grundgedanke dahinter ist ja, dass immer die Objektreferenz verglichen wird und nicht das Objekt an sich, so dass man mit dem ersten Codebeispiel die Arraylist beliebig verwenden kann, wenn man neue Obstsorten erzeugt.
Gibt es dann noch einen Grund, das zweite Codebeispiel irgendwann anzuwenden, wenn man auch das erste nehmen könnte? :rtfm:
 

Kel

Aktives Mitglied
Obst ist Superklasse, kein Interface. Apfel erbt also alle Instanzvariablen und Methoden von Obst und man kann daher auf alle Methoden von Obst und von Apfel zugreifen.
 

Crian

Top Contributor
Ob nun Interface oder Superklasse ist egal. Apfel könnte ja noch weitere Funktionalitäten anbieten. Und wenn man darauf zugreifen möchte, sollte er auch als "Apfel" angesprochen werden, und nicht als "Obst".
 

Kel

Aktives Mitglied
Und wenn man darauf zugreifen möchte, sollte er auch als "Apfel" angesprochen werden, und nicht als "Obst".
Oh, seh grad, dass man nicht auf die Methoden von
Code:
Apfel
zugreifen kann, wenn die Referenz als
Code:
Obst
wählt. Natürlich nicht so gut :bahnhof:.

Gibt es eine Möglichkeit, Polymorphie und Zugriff auf das Objekt zu vereinen?
 

Kel

Aktives Mitglied
Widerspricht sich die Anforderung denn nicht?
Ja, das merke ich grade auch. Bin grad nochmal am durchlesen von Polymorphie und ein
Code:
Apfel
-Objekt passt auch in ein
Code:
Obst
-Array.

Also muss man immer, wenn man spezifische Methoden einer Unterklasse braucht,
Code:
Apfel apfel = new Apfel()
nehmen.
Aber wozu braucht man den dann
Code:
Obst apfel = new Apfel()
?
Das beschränkt ja im Grunde absichtlich die Zugriffsmöglichkeiten eines Objektes, da die Referenz keinen kompletten Zugriff auf die Sachen des Objektes hat.
 
Zuletzt bearbeitet:

Michael...

Top Contributor
Aber wozu braucht man den dann
Code:
Obst apfel = new Apfel()
?
Wie Du selbst schon aufgeführt hast um z.B. Äpfel und Birnen in einer gemeinsamen "Obstschale" abzulegen.
Also muss man immer, wenn man spezifische Methoden einer Unterklasse braucht, Apfel apfel = new Apfel() nehmen.
Nein man kann im Bedarfsfall casten:
Java:
Obst obst = new Apfel();
...
if (obst instanceof Apfel) {
    Apfel apfel = (Apfel)obst;
    ...
}
 

Kel

Aktives Mitglied
Wie Du selbst schon aufgeführt hast um z.B. Äpfel und Birnen in einer gemeinsamen "Obstschale" abzulegen.
Das geht aber doch auch, ohne dass die Objektreferenz die Superklasse ist?
Wenn ich
Code:
Apfel apfel = new Apfel()
und
Code:
Birne birne = new Birne()
erzeuge, passen
Code:
apfel
und
Code:
birne
trotzdem in ein
Code:
Obst[] obst = new Obst[2];
-Arrayobjekt.

Nein man kann im Bedarfsfall casten:
Wird beim casten nur die Typreferenz geändert? Also einfach die Referenz in
Code:
Apfel
gewandelt und somit die Zugriffsmöglichkeiten erweitert?
 

Michael...

Top Contributor
Das geht aber doch auch, ohne dass die Objektreferenz die Superklasse ist?
Wenn ich
Code:
Apfel apfel = new Apfel()
und
Code:
Birne birne = new Birne()
erzeuge, passen
Code:
apfel
und
Code:
birne
trotzdem in ein
Code:
Obst[] obst = new Obst[2];
-Arrayobjekt.
Ja, das geht selbstverständlich auch ohne. Meiner Meinung spricht nichts dagegen als Refernz Typ Apfel zu nehmen, wenn man einen Apfel erzeugt. Ist aber vielleicht auch eine philosohpie Frage: Warum soll mein eine Variable vom Typ Apfel halten, wenn wenn nur Attribute und Methoden von Obst benötigt.
Wird beim casten nur die Typreferenz geändert? Also einfach die Referenz in
Code:
Apfel
gewandelt und somit die Zugriffsmöglichkeiten erweitert?
Würde einfach mal sagen: Ja. Weiss es aber nicht, die Frage, was da genau passiert, habe ich mir bisher nie gestellt.
 
M

Marcinek

Gast
Hallo,

ich denke der wahre Sinn wird erst dann sichtbar, wenn du komplexe Anwendungen schreibst.

Zum Beispiel: Du hast einen Logger

und eine Abstrakte Methode
Code:
protected abstrakt Logger getLogger();

die Abgeleitete Klasse macht dann
Code:
return new LoggerA()
oder
Code:
 return new LoggerB();

Beide Logger implementieren unterschiedliche vorgehensweisen anhand eines "Contracts"

Würde der Kollege, der hier wegen seiner Anwendung für Arztpraxen rumfragt, dieses Konzept verstanden haben, dann hätte er keine Probleme ^^
 
Zuletzt bearbeitet von einem Moderator:
Ähnliche Java Themen
  Titel Forum Antworten Datum
Say Objektreferenz Java Basics - Anfänger-Themen 18
J Übergeben einer Objektreferenz Java Basics - Anfänger-Themen 6
B Collections Objektreferenz-ID in der Ausgabe (Comparator Interface) Java Basics - Anfänger-Themen 2
P Objektreferenz Java Basics - Anfänger-Themen 2
L Methoden Probleme mit einer Objektreferenz Java Basics - Anfänger-Themen 1
B Objektreferenz Java Basics - Anfänger-Themen 4
V Auf Objektreferenz über Attribut zugreifen Java Basics - Anfänger-Themen 10
C Objektreferenz holen statt übergeben Java Basics - Anfänger-Themen 2
W Objektreferenz, null Java Basics - Anfänger-Themen 15
M Objektreferenz und null Java Basics - Anfänger-Themen 5
moini Auf Array aus Superklasse zugreifen? Java Basics - Anfänger-Themen 2
C Initialiseren einer Superklasse Java Basics - Anfänger-Themen 2
L Wie greife ich in der Subklasse auf die Parameter einer Methode der Superklasse zu ? Java Basics - Anfänger-Themen 15
N Mit Objekt der Superklasse auf Methode der Subklasse zugreifen Java Basics - Anfänger-Themen 6
Kirby.exe Methode aus Superklasse benutzen Java Basics - Anfänger-Themen 18
V Vererbung Subklasse soll Superklasse verändern Java Basics - Anfänger-Themen 2
F Java - Superklasse BUG Java Basics - Anfänger-Themen 1
M Vererbung Superklasse -> Subklasse Java Basics - Anfänger-Themen 3
D Compiler-Fehler Konstruktor von Superklasse übernehmen Java Basics - Anfänger-Themen 1
P auf superklasse zugreifen Java Basics - Anfänger-Themen 24
C Superklasse und Klassen ausgeben Java Basics - Anfänger-Themen 7
J Vererbung Variablen aus Superklasse übernehmen Java Basics - Anfänger-Themen 2
D Instanz einer Subklasse anhand deren Superklasse Java Basics - Anfänger-Themen 5
A Array in Subklasse - Werte aus Superklasse Java Basics - Anfänger-Themen 4
gamebreiti Problem mit Setter in Superklasse Verkettung der Kostruktoren??? Java Basics - Anfänger-Themen 7
R Vererbung Übergabe von Variablen der Superklasse an Subklasse mit "extends" Java Basics - Anfänger-Themen 5
F Superklasse nochmals erzeugen? Java Basics - Anfänger-Themen 7
A Vererbung Wie auf Variablen der Superklasse zugreifen? Java Basics - Anfänger-Themen 10
M Vererben von Superklasse ohne Konstruktor Java Basics - Anfänger-Themen 9
G Auf einen bestimmten Konstruktor in der abstrakten Superklasse zugreifen? Java Basics - Anfänger-Themen 2
W Superklasse Konstruktor Java Basics - Anfänger-Themen 9
K Methodenvererbung durch eine Superklasse Java Basics - Anfänger-Themen 7
M OOP Klasse mit Superklasse instanzieren Java Basics - Anfänger-Themen 3
D Klassen Problem - Übergabe an Konstruktor von Superklasse Java Basics - Anfänger-Themen 2
E Der Konstruktor der Superklasse Java Basics - Anfänger-Themen 8
capgeti Datentypen Static methoden aus Superklasse mit Generics definieren? Java Basics - Anfänger-Themen 9
J Subklasse soll alle Klassen/Pakete der Superklasse importieren Java Basics - Anfänger-Themen 3
G Vererbung mit einer Instanz aus der Superklasse Java Basics - Anfänger-Themen 2
G Zugriff auf Superklasse Java Basics - Anfänger-Themen 13
N Zugriff auf Vaiablen inhalte der superklasse Java Basics - Anfänger-Themen 7
R App soll selbstständig reagieren, anstatt via Models Java Basics - Anfänger-Themen 0
T jOptionPane zum schließen von Fenster, wie "Ja" und "Nein" anstatt Yes und No Java Basics - Anfänger-Themen 2
I Output BigDecimal anstatt double / Problem beim Rechnen Java Basics - Anfänger-Themen 16
I Format Problem mit Wert - bekomme 0,10 anstatt 10,00 Java Basics - Anfänger-Themen 6
P Hashmap anstatt LinkedList? Java Basics - Anfänger-Themen 6
T GUI anstatt Bild schwarzes Rechteck gespeichert Java Basics - Anfänger-Themen 0
U buttonarray[this] anstatt buttonarray[index] ? Java Basics - Anfänger-Themen 12
M Anstatt 1 int Rückgabewert, mehrere Rückgaben mit Arraylist Java Basics - Anfänger-Themen 8
J Array anstatt Begriffe als Indizes Java Basics - Anfänger-Themen 14
I Erste Schritte while anstatt for, if und break Java Basics - Anfänger-Themen 10
K Was benutzen anstatt this? Java Basics - Anfänger-Themen 9
B List list - anstatt ArrayList list = new ArrayList Java Basics - Anfänger-Themen 10
D JTextField anstatt Jbuttons Java Basics - Anfänger-Themen 9
A POI Einlesen Excel Workbook aus BLOB oder von URL anstatt aus Filesystem ? Java Basics - Anfänger-Themen 3
P (Arbeitstag-) Calendar - 9 anstatt 24 Stunden Java Basics - Anfänger-Themen 12
dl85hej Zeitsitschleife anstatt Timer Java Basics - Anfänger-Themen 5
B String.equals(Object) anstatt "=" Java Basics - Anfänger-Themen 3
Horst79 Temp Datei cachen anstatt physikalische Datei im root Verz? Java Basics - Anfänger-Themen 8
G start-oder paint-Methode anstatt Event-Handling-Methode? Java Basics - Anfänger-Themen 3
S StringBuffer anstatt += Java Basics - Anfänger-Themen 8
C Servlets: doPost() etc. anstatt service() Java Basics - Anfänger-Themen 4
C Anstatt Spalte, Zeile mit Comparator sortieren . Java Basics - Anfänger-Themen 5
D contains bei JTextArea anstatt bei JTextField Java Basics - Anfänger-Themen 8
H private anstatt public Java Basics - Anfänger-Themen 2
C Wie kann ich Grichische Buchstaben ausgeben anstatt latein? Java Basics - Anfänger-Themen 2
M Ausgabe in String anstatt auf Stream Java Basics - Anfänger-Themen 17

Ähnliche Java Themen

Neue Themen


Oben