Verständnisfrage Objekt instanzierung / Polymorphie

Status
Nicht offen für weitere Antworten.

_fliX

Mitglied
Hallo zusammen,

habe etliche Beispiele und Definitionen/Erklärungen über Polymorphie gelesen, verstehe allerdings noch immer nicht wirklich den Sinn dahinter. Als Beispiel möchte ich gerne auf JAVA: 5.4 Polymorphie verweisen.

Die Sache mit der Vererbung und Überschreibung der Methode ist klar. Was ich nicht verstehe ist in der main Methode (unten) die Instanziierung mittels:

Angestellter a2 = new Abteilungsleiter();

Warum ist dort nicht einfach "Abteilungsleiter a2 = new Abteilungsleiter();"?
Damit hätte man genauso Zugriff auf alle Attribute aus der Klasse Angestellter (da Abteilungsleiter Subklasse von Angestellter ist) und
ich wäre nicht verwirrt! :) Soll das heissen, das die Referenz a2 zur Klasse Angestellter gehört (zum Datentyp Angestellter), aber mit den Attributen/Methoden (eben
dem Attribut Abteilung mehr) instanziiert wird? Wenn ja, welcher Sinn steckt dahinter, wenn ich es auch mit "Abteilungsleiter a2 = new Abteilungsleiter();" machen kann?

Bin bisher davon ausgegangen, das man Objekekte mittels "Klasse Ref = new Klasse();" instanziert und nicht auf einmal mit zwei verschiedenen Werten bei der Klasse (auch wenn es eine Subklasse/Superklasse ist).

Vielen Dank schon mal
 
M

maki

Gast
Das ist doch das schöne an der Polymorpie, man muss gar nicht die konkrete Klasse/Implementierung wissen, sondern kann davon ausgehen dass die Objekte ein Interface implementieren bzw. alle eine gemeinsame Superklasse haben und bezieht sich nur darauf, so bleibt man flexibel weil unabhängig von der konkreten Klasse.
 

faetzminator

Gesperrter Benutzer
Vor allem bei Interfaces hat dies einen Sinn. Stell dir vor, du hast eine Methode, welche mit einer ArrayList arbeitet. Alle Methoden, welche du von ArrayList benötigen wirst, sind ebenfalls in List enthalten. Wenn ich nun eine andere Implementierung von List verwenden will, könnte ich deine Methode nicht aufrufen - da sie ArrayList will.
Man definiert grundsätzlich immer in der Hirarchie möglichst "hohe" Variablen, Parameter etc. - also grundsätzlich die höchste Stufe, welche noch die benötigten Methoden beinhaltet.
 
B

bygones

Gast
Das ist doch das schöne an der Polymorpie, man muss gar nicht die konkrete Klasse/Implementierung wiossen, sondern kann davon ausgehen dass die Objekte ein Interface implmentieren und bezieht sich nur darauf, so bleibt man flexibel weil unabhängig von der konkreten Klasse.
soll heissen, wenn dein Abteilungsleiter misst bau und zum arbeiter degradiert wirst musst du deine Implementierung nur an extakt einer Stelle aendern
Java:
Angestellter a2 = new Arbeiter();
und alles laeuft noch wie es soll.

Andernfalls muesstest du ueberall wo der liebe Herr Abteilungsleiter vorkommt Aenderungen vornehmen (und stell dir dann vor er bessert sich und wird sogar Geschaeftsfuehrer etc)...


weil hier nun alle ueber Interfaces reden... in diesem Fall handelt es sich um eine Klassen deren Unterklasse MEHR definieren als die Oberklasse.

Da ists dann halt situationsbedingt... wenn dir die logik von Angesteller reicht nutze die (wie hier beschrieben), wenn du aber die zusaetzliche Information der Unterklasse brauchst musst du diese auch nutzen.
 
Zuletzt bearbeitet von einem Moderator:

_fliX

Mitglied
hmm vllt. hab ich auch einfach nur ein Problem, die Instanzierung zu übersetzen.

"Angestellter a2 = new Abteilungsleiter();"

zu deutsch:

ich deklariere a2 als eine neue Referenzvariable vom Datentyp Angestellter (was bedeutet das "er ist vom Datentyp Angestellter"? Wenn es z.B. einen primitiven Datentyp erhält (z.B. boolean), weiss ich, dass es nur True oder False haben kann. Was bedeutet das, wenn der Datentyp eine Klasse ist?) und Verweise auf die Speicheradresse a2, welche das Objekt der Klasse Abteilungsleiter enthält?

soll heissen, wenn dein Abteilungsleiter misst bau und zum arbeiter degradiert wirst musst du deine Implementierung nur an extakt einer Stelle aendern
Java:
Angestellter a2 = new Arbeiter();
und alles laeuft noch wie es soll.

Andernfalls muesstest du ueberall wo der liebe Herr Abteilungsleiter vorkommt Aenderungen vornehmen (und stell dir dann vor er bessert sich und wird sogar Geschaeftsfuehrer etc)...

öhm dann ändere ich einfach ab auf Angestellter a2 = new Angestellter. Das ist doch auch nur eine Änderung
 
Zuletzt bearbeitet:

faetzminator

Gesperrter Benutzer
a2 ist immer noch ein Abteilungsleiter, allerdings wird er von dir nur als Angestellter erkennt. Du könntest alle Objekte als Object speichern, hast dann allerdings nur toString() u.ä.
 

sliwalker

Top Contributor
Das Fachwort dafür ist covariant types.

Man muss ein bisschen dahin schauen, was eigentlich passiert.
Deine Erklärung ist schon ganz gut, aber den Kern siehst DU noch nicht...

Du legst eine Referenzvariable vom Typ Abteilungsleiter an. Den Typ einer Referenzvariable kannst Du niemehr ändern, jedoch den Wert zur Laufzeit. Ganz wichtig ist hier darauf zu achten, ob Du von compiletime oder runtime redest.

Jede Klasse ist gleichzeitig vom gleichen Typ wie alle ihre Interfaces, sowie "Superklassen". Das ist Anführungszeichen, weil eine Klasse direkt nur eine Superklasse haben kann, diese jedoch wieder eine, bis man bei Object angelangt ist. Beim erstellen einer Instanz mittels new, werden alle konstruktoren aller Superklasse durchlaufen, seinen sie auch abstrakt.

Zur Laufzeit wird entschieden, welcher Datentyp "in der Referenzvariable" als Wert gespeichert ist.
Dein Beispiel ist ein simpler und automatischer Upcast, den man nicht explizit hinschreien muss. Die andere Richtung ist ein Downcast (oder andersrum?), eben jener wo Du den "neuen" Datentypwert in Klammern davor schreibst.

Ich hoffe es ist einwenig verständlich?
 

_fliX

Mitglied
bin das thema gerade noch einmal angegangen. was man mit polymorphie machen kann verstehe ich, wie man es anwendet auch, allerdings ist mir die theorie noch etwas schleierhaft. habe das ganze mal verglichen mit den primitiven datentypen

int x = 2
x = irgendnen_char_wert

das ist hier ja ein implizierter cast, d.h. wird von alleine gemacht, weil char automatisch ein int ist (von der größe her passt er in ein int.

wenn ich diese beispiel jetzt auf referenzobjekte anwende hab ich folgendes:

arbeiter a = new arbeitgeber();

hier soll laut der java seite (Inheritance (The Java™ Tutorials > Learning the Java Language > Interfaces and Inheritance)) auch ein implizierter cast durchgeführt werden. das kann aber irgendwie nicht ganz stimmen, da der datentyp arbeitgeber größer ist als arbeiter (enthält meistens ergänzende methoden/variablen). ausserdem kann ein array vom typ arbeiter nur auf die methoden von arbeiter zugreifen (wenn ich eine methode test nur bei arbeitgeber adde, kann sie nicht gefunden werden). das heisst doch eigentlich, dass es ein automatischer expliziter cast ist oder?
 
S

SlaterB

Gast
Was bedeutet explizit und implizit? | LYCOS iQ

dass beides implizit ist, muss doch wohl kaum diskutiert werden,

allerdings ist nicht beides ein Cast, bei char to int nennt sich das bestimmt anders,
Werteübertragung oder so, das kann man mit dem Vererbungssystem nicht vergleichen

ein char ist kein int, eher andersrum, ein int ist auch ein char (+ mehr),


arbeitgeber x = new arbeitgeber(arbeiter);
wäre ein ähnliches Konstrukt,
Anlegen eines neuen arbeitgeber-Objektes mit allen Informationen von arbeiter + Rest Default-Werte
 
Zuletzt bearbeitet von einem Moderator:

sliwalker

Top Contributor
Ähm,

"x" ist eine Referenzvariable die immer, bei jedem Objekt, gleich groß ist, weil es eben eine Referenz (eine Adresse im Speicher) ist. Der Typ der Referenzvariable ist ausschlaggebend für die verfügbaren Methoden. Hier "arbeitgeber". Dies zur Kompilierzeit, nicht zur Laufzeit.

Die Zuweisung einer neuen Referenz(eines neuen Objekts) zu einer Referenzvariable, wo die Klasse des neuen Objekts in der Vererbungshierachie höher (also weniger spezialisiert) liegt ist ein impliziter upcast.

Was Dich vermutlch stört ist, dass doch wahrscheinlich "arbeitgeber" viel mehr Methoden und Attribute besitzt und daher größer sein muss. Nein. Es handelt sich nur um eine Adresse. Der belegte Speicherplatz, wenn den mal ein Objekt erstellt wird, entscheidet sich schon zur Kompilierzeit durch den Typ der Referenzvariable.

Die "dynamische Typermittlung" (mir ist das Wort entfallen) zur Laufzeit hingegen, entscheidet, WELCHE Methode aus welcher Klasse aufgerufen wird. Nochmal zur Erinnerung: Zur Kompilierzeit wird nur entschieden, welche Methoden verfügbar sind.
 

sliwalker

Top Contributor
Hab ich noch vergessen:

Der Datentyp "char" ist ein 16 Bit unsigned integer.
Also ist ein char ein int, weil er in den 32 Bit großen integer-Typ reinpasst.
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Verständnisfrage Objekt Getter Setter Java Basics - Anfänger-Themen 102
M Verständnisfrage: Objekt erzeugen u. zuweisen Java Basics - Anfänger-Themen 16
J Verständnisfrage: Konstruktorproblem bei statischem Objekt Java Basics - Anfänger-Themen 4
M Java Iterator Verständnisfrage Java Basics - Anfänger-Themen 6
A Verständnisfrage Java Basics - Anfänger-Themen 12
M Verständnisfrage: Warum wird die Datei ohne Inhalt übertragen Java Basics - Anfänger-Themen 3
P Verständnisfrage: PageFactory.initElements Java Basics - Anfänger-Themen 2
R do while Schleife Verständnisfrage Java Basics - Anfänger-Themen 2
G while.next() Verständnisfrage Java Basics - Anfänger-Themen 16
Vivien Kurze Verständnisfrage zu Java Point aus java.awt.* Java Basics - Anfänger-Themen 5
C Erste Schritte Anfänger Verständnisfrage zum Compiler Java Basics - Anfänger-Themen 31
K Verständnisfrage Server/Client BufferedReader, PrintWriter Java Basics - Anfänger-Themen 2
Der Grütz Verständnisfrage zu Übung aus Java Kurs - Schaltjahr bestimmen Java Basics - Anfänger-Themen 2
J Verständnisfrage zu throws neben Funktionen Java Basics - Anfänger-Themen 2
TimoN11 Verständnisfrage bei Aufgabe Java Basics - Anfänger-Themen 2
P Verständnisfrage zum Mapping Java Basics - Anfänger-Themen 3
M Java Version Verständnisfrage Java Basics - Anfänger-Themen 16
M Verständnisfrage zu eine Online Aufgabe Java Basics - Anfänger-Themen 7
T Verständnisfrage zur Konsolenausgabe Java Basics - Anfänger-Themen 2
M Verständnisfrage zu Generics Java Basics - Anfänger-Themen 7
D Verständnisfrage zur Modellierung einer HDD Java Basics - Anfänger-Themen 17
W Methoden Verständnisfrage Vererbung von Methoden Java Basics - Anfänger-Themen 14
S Verständnisfrage lokale Ordnerpfade Java Basics - Anfänger-Themen 1
T Verständnisfrage zu Interfaces Java Basics - Anfänger-Themen 7
J Java Starthilfe Verständnisfrage Aufgabe Java Basics - Anfänger-Themen 2
O Anfänger, Verständnisfrage Java Basics - Anfänger-Themen 3
C Verständnisfrage zu Modulo Java Basics - Anfänger-Themen 6
C Verständnisfrage bezüglich der Do-While Schleife Java Basics - Anfänger-Themen 9
L Verständnisfrage - Speicherabbild Java Basics - Anfänger-Themen 4
melly_ Verständnisfrage zu args Java Basics - Anfänger-Themen 3
A Variablen Verständnisfrage bzgl. Variablen/Referenzen Java Basics - Anfänger-Themen 3
K Verständnisfrage eines Abschnitts Java Basics - Anfänger-Themen 6
K Rekursion Verständnisfrage Java Basics - Anfänger-Themen 19
S Modell View Controller Verständnisfrage Java Basics - Anfänger-Themen 24
J Superklassen Konstruktor Verständnisfrage Java Basics - Anfänger-Themen 1
JavaTalksToMe Erste Schritte Println-Frage (Verständnisfrage) Java Basics - Anfänger-Themen 1
R Verständnisfrage zu Objekten u. Übergabeparameter Java Basics - Anfänger-Themen 8
G Collections Verständnisfrage zur For-Each-Schleife Java Basics - Anfänger-Themen 7
b1ck Interface Verständnisfrage zum GUI mit "swing" Java Basics - Anfänger-Themen 1
kilopack15 Verständnisfrage zur Verwendung von notify() bei Threads Java Basics - Anfänger-Themen 2
G Verständnisfrage zu for-each Java Basics - Anfänger-Themen 4
DontFeedTheTroll Erste Schritte Verständnisfrage zu If-Anweisung Java Basics - Anfänger-Themen 7
K Rekursion-Verständnisfrage Java Basics - Anfänger-Themen 4
J Java Server Pages - Verständnisfrage Java Basics - Anfänger-Themen 2
Z Verständnisfrage Anfängerprogramm Java Basics - Anfänger-Themen 0
T Verständnisfrage Zuweisungs-/arithmet. Operatoren Java Basics - Anfänger-Themen 2
G Methoden Verständnisfrage zur Methoden Java Basics - Anfänger-Themen 7
LionAge Kapselung, Verständnisfrage zur Objekterzeugung Java Basics - Anfänger-Themen 4
Z Verständnisfrage zum Multithreading Java Basics - Anfänger-Themen 3
R OOP / Verständnisfrage zum Konstuktor (siehe code) Java Basics - Anfänger-Themen 7
gamebreiti Verständnisfrage zu contains() Java Basics - Anfänger-Themen 10
A Verständnisfrage - Koordinatenumrechnung Java Basics - Anfänger-Themen 9
J Erste Schritte Verständnisfrage im Bezug auf das (richtige) Programmieren Java Basics - Anfänger-Themen 5
M Verständnisfrage zu JUnit Tests und private Methoden Java Basics - Anfänger-Themen 3
H Verständnisfrage Array Java Basics - Anfänger-Themen 2
I Interface Verständnisfrage Interfaces (Bsp.: Enumeration) Java Basics - Anfänger-Themen 2
I Verständnisfrage zu BridgePattern, Verwedung von super() Java Basics - Anfänger-Themen 4
P Verständnisfrage Java Basics - Anfänger-Themen 3
kaoZ Best Practice Verständnisfrage Listener bei lokalen Objekten Java Basics - Anfänger-Themen 8
D Input/Output Verständnisfrage Verzeichnis-/Dateiliste erstellen & Dateikonvertierung Java Basics - Anfänger-Themen 1
S Verständnisfrage zu Anweisungen und deren Wirkung Java Basics - Anfänger-Themen 7
H Verständnisfrage für oder Anweisung Java Basics - Anfänger-Themen 8
E Threads Verständnisfrage bzgl. Threads und Sleep Java Basics - Anfänger-Themen 2
T Erste Schritte Verständnisfrage: Getter und Setter Methoden Java Basics - Anfänger-Themen 3
H Verständnisfrage zu Java-Ausgabe Java Basics - Anfänger-Themen 3
S Verständnisfrage Java Basics - Anfänger-Themen 2
N Verständnisfrage Code Java Basics - Anfänger-Themen 8
B Verständnisfrage Java Basics - Anfänger-Themen 2
H Interface Comparable Verständnisfrage Java Basics - Anfänger-Themen 6
B Verständnisfrage Codezeile Java Basics - Anfänger-Themen 7
B Verständnisfrage:Beispielprogramm BlueJ Java Basics - Anfänger-Themen 3
M Kurze Verständnisfrage zu einer Java Aufgabe Java Basics - Anfänger-Themen 12
K Erste Schritte Kleine Verständnisfrage Java Basics - Anfänger-Themen 12
R Verständnisfrage Referenzvariablen in array Java Basics - Anfänger-Themen 3
I OOP Verständnisfrage zu Singelton Pattern Java Basics - Anfänger-Themen 21
M Verständnisfrage zu JPanel Java Basics - Anfänger-Themen 3
S Verständnisfrage: Exception Gebrauch Java Basics - Anfänger-Themen 2
R Verständnisfrage NPE Java Basics - Anfänger-Themen 5
M Verständnisfrage zur Zahlenumwandlung (Dezimal-->Dual) Java Basics - Anfänger-Themen 25
P Java Objekte - Verständnisfrage Java Basics - Anfänger-Themen 9
N Verständnisfrage zu folgendem Programm Java Basics - Anfänger-Themen 2
L Grundlegende Verständnisfrage Hasmap Referenzen Java Basics - Anfänger-Themen 4
S Verständnisfrage zu Interfaces Java Basics - Anfänger-Themen 2
VfL_Freak Verständnisfrage zur Klasse "TIMER" Java Basics - Anfänger-Themen 7
P Verständnisfrage zu Instanzen/Objekten Java Basics - Anfänger-Themen 9
M Verständnisfrage im Umgang mit Map Java Basics - Anfänger-Themen 10
K Verständnisfrage zu int.length und String.length() Java Basics - Anfänger-Themen 4
G 2D Array gleichsetzen verständnisfrage Java Basics - Anfänger-Themen 2
M kleine und einfache Verständnisfrage Java Basics - Anfänger-Themen 3
N verständnisfrage java.util.Calendar Java Basics - Anfänger-Themen 4
G Datentypen bits, bytes, chars - Verständnisfrage Java Basics - Anfänger-Themen 5
E Verständnisfrage zu Shutdownhook Java Basics - Anfänger-Themen 5
D Verständnisfrage: Java und MySql Java Basics - Anfänger-Themen 3
F Rekursion Verständnisfrage Java Basics - Anfänger-Themen 6
A Exception Verständnisfrage: Exceptions während, einer Statischenzuweisung abfangen Java Basics - Anfänger-Themen 10
Z Comparator Verständnisfrage Java Basics - Anfänger-Themen 5
D Verständnisfrage zu Funktionen Java Basics - Anfänger-Themen 6
H Verständnisfrage Persistenz Java Basics - Anfänger-Themen 10
neurox Verständnisfrage zu Threads Java Basics - Anfänger-Themen 4
E Verständnisfrage Syntax: frame.getContentPane().add(button) Java Basics - Anfänger-Themen 11

Ähnliche Java Themen

Neue Themen


Oben