Vererbung/Dynamische Bindungen

Status
Nicht offen für weitere Antworten.

neXes

Mitglied
Hallo,

habe eine kleine Frage zu den allseits beliebten dynamischen Bindungen (ich bin mir zumindest relativ sicher, dass es sich bei meiner Frage auch tatsächlich darum dreht).

Folgender Code stammt aus einem Java-Buch:

Code:
class AKlasse {
  public int wert = 0;
  public int wert() {
    return this.wert;
  }
}

/* ****************************************************************** */

class CKlasse extends AKlasse {
  public int wert = 1;
  public int wert() {
    return this.wert;
  }
}

/* ****************************************************************** */

public class ElchTest {
  public static void main(String argv[]) {
    AKlasse a = new AKlasse();
    System.out.println("Wert von a ist: " + a.wert);
    System.out.println("Wert von a ist: " + a.wert());
    CKlasse b = new CKlasse();
    System.out.println("Wert von b ist: " + b.wert);
    System.out.println("Wert von b ist: " + b.wert());
    AKlasse c = b;
    System.out.println("Wert von c ist: " + c.wert);
    System.out.println("Wert von c ist: " + c.wert());
  }
}

Die Ausgabe lautet:

Code:
Wert von a ist: 0
Wert von a ist: 0
Wert von b ist: 1
Wert von b ist: 1
Wert von c ist: 0
Wert von c ist: 1

Die Ausgabe von "a" ist mir klar. Die Ausgabe von "b" erklär ich mir folgendermaßen. Attribute und Methoden werden an die Unterklassen vererbt, in diesem Fall jedoch überschrieben (richtig?). Die Ausgabe von "c" kann ich jedoch nicht ganz nachvollziehen. Die Variable c bekommt doch in Zeile 28 ein CKlasse-Objekt zugewiesen, welches den Wert 1 hat, warum also die Ausgabe 0? Ist nicht immer der tatsächliche Typ des Objektes relevant (hier: CKlasse) und nicht der deklarierte (hier: AKlasse)? Und selbst wenn das Attribut von c den Wert 0 hat, warum gibt die Methode 1 aus?

Ich befürchte der Groschen ist bei dieser Thematik noch nicht gefallen und bedanke mich bereits im Voraus für etwaige Erklärungsversuche!
 

Schandro

Top Contributor
CKlasse erbt zwar von AKlasse, besitzt aber eine eigene Membervariable wert, die leider genauso heisst wie die aus AKlasse. Es ist nicht diesselbe, sondern eine neue!

Code:
    CKlasse b = new CKlasse();
    System.out.println("Wert von b ist: " + b.wert); // hier wird die Variable von CKlasse genommen
    System.out.println("Wert von b ist: " + b.wert());
    AKlasse c = b; // "c" bezieht sich zwar auf dasselbe wie "b", wurde aber ge-downcastet
    System.out.println("Wert von c ist: " + c.wert); // hier wird die Variable von AKlasse genommen
    System.out.println("Wert von c ist: " + c.wert());

Die Methode c.wert() gibt aber beides mal dasselbe aus, trotz des downcast, weil diese schließlich in CKlasse überschrieben wurde.
 

neXes

Mitglied
Vielen Dank für deinen Erklärungsversuch. Ich befürchte jedoch, dass er eine Nummer zu schnell für mich war. Mein Verständnisproblem liegt offenbar in folgender Zeile:

Schandro hat gesagt.:
Code:
AKlasse c = b; // "c" bezieht sich zwar auf dasselbe wie "b", wurde aber ge-downcastet

Kann mir evtl. jemand erklären was in dieser Zeile genau passiert? Nach meinem Verständnis hat man durch die Superklasse "AKlasse" hier den Vorteil, dass eine Variable dieses Typs (hier: c) auch auf Objekte der Subklassen verweisen kann (ich hoffe ich hab mich richtig ausgedrückt?!). Was hat es jedoch mit dem hier angesprochenen "downcast" auf sich? Habe mal kurz gegoogelt und habe mir gemerkt downcast ~ ableiten? Warum aber wurde c abgeleitet von b, schließlich ist AKlasse doch die Superklasse und in wie wirkt sich das auf das Attribut "wert" aus :bahnhof:

Ich denke mal meine Fragen sind für euch selbstverständlich und unter eurem Niveau, hoffe aber dennoch, dass ihr noch ein bisschen Geduld mit mir habt :oops:
 

hdi

Top Contributor
Die Methode wert() in CKlasse überschreibt die Methode wert() in AKlasse.
Die Variable wert inCKlasse dagegen überschattet die Variable wert in AKLasse.

Wenn man auf Methoden zugreift, wird immer die von derjenigen Klassen genommen,
von deren speziellsten Typ das Objekt ist, sprich die unterste Unterklasse sozusagen.
(Falls die Methode dort exisitert, also überschrieben wurde, ansonsten geht's eine Ebene höher usw)

Wenn man aber direkt auf Variablen zugreift, und nicht über Methoden, wird immer der Wert von
derjenigen Klasse hergenommen, von deren allgemeinsten Typ das Objekt ist.
Und das ist hier eben AKlasse.

Also Methoden -> "Override"
und Attribute -> "Overload"

Ich kann dich aber beruhigen: Solche Probleme wirst du niemals wirklich haben, weil man Attribute immer
private macht. Dadurch sind sie nach außen hin nicht sichtbar und man kann gar nicht direkt darauf
zugreifen
 

Schandro

Top Contributor
Wenn man aber direkt auf Variablen zugreift, und nicht über Methoden, wird immer der Wert von
derjenigen Klasse hergenommen, von deren allgemeinsten Typ das Objekt ist.

Nur um mal einen Begriff zu klären:
Der allgemeinste Typ im Falle von "c" bei
CKlasse c = new CKlasse();
ist CKlasse, oder? Ansonsten würd dein Satz nicht mit der Realität von neXes übereinstimmen
 

hdi

Top Contributor
Der allgemeinste Typ im Falle von "c" bei
CKlasse c = new CKlasse();
ist CKlasse, oder?

Ja klar, wenn du links und rechts vom "=" den exakt gleichen Typ hast brauchst du dir eh keine
Gedanken machen, dann ist ja klar welche Methoden und Attribute benutzt werden.

Nur zB bei

AKlasse c = new CKlasse();

ist der allgemeinste Typ "AKlasse" und der speziellste Typ "CKlasse",
weil CKLasse eine Unterklasse von AKlasse ist.
 

neXes

Mitglied
hdi hat gesagt.:
Die Methode wert() in CKlasse überschreibt die Methode wert() in AKlasse.
Die Variable wert inCKlasse dagegen überschattet die Variable wert in AKLasse.

Wenn man auf Methoden zugreift, wird immer die von derjenigen Klassen genommen,
von deren speziellsten Typ das Objekt ist, sprich die unterste Unterklasse sozusagen.
(Falls die Methode dort exisitert, also überschrieben wurde, ansonsten geht's eine Ebene höher usw)

Wenn man aber direkt auf Variablen zugreift, und nicht über Methoden, wird immer der Wert von
derjenigen Klasse hergenommen, von deren allgemeinsten Typ das Objekt ist.
Und das ist hier eben AKlasse.

Also Methoden -> "Override"
und Attribute -> "Overload"

Vielen Dank für deine ausführliche Antwort! Habe es jetzt verstanden und merke mir die beiden letzten zitierten Zeilen von dir, was sich möglicherweise auch der Autor dieser Aufgabe gewünscht hat :wink:
 

hdi

Top Contributor
Ich würde an deiner Stelle aber trotzdem nochmal warten, bis das einer der Profis hier bestätigt hat,
was ich geschrieben habe ;)

Ich bin zwar kein Anfänger mehr aber gerade bei solchen Definitionen und komischne Bsp fühle ich mich
noch oft ein wenig wacklig auf den Beinen. Kann dir jetzt nicht zu 100% sagen ob das so korrekt war.

PS: Allgemein: Ich hab zB ein Projekt "GoodToKnow", dort speicher ich mir immer kleine ausführbare Bsp
von solchen Dingen wie dem hier ab. Da sind auch Dinge von Call-By-Refernce drin, static vs. dynamic usw.
Kann ich nur empfehlen, denn sowas vergisst man leider viel zu schnell, weil man auch nur seltener damit
konfrontiert ist.
 

Niki

Top Contributor
hdi hat gesagt.:
...Wenn man aber direkt auf Variablen zugreift, und nicht über Methoden, wird immer der Wert von
derjenigen Klasse hergenommen, von deren allgemeinsten Typ das Objekt ist.
Und das ist hier eben AKlasse...

Es wird nicht auf die Variable der allgemeinsten Klasse zugegriffen, sonder auf den Typ der Deklaration.

Beispiele:
Code:
public class A {
    String x = "A";
}

Code:
public class B extends A{
    String x = "B";
}

Code:
public class C extends B{
    String x = "C";
}

Code:
C c = new C();
System.out.println(c.x + " " + c.x);
B b = c;
System.out.println(c.x + " " + b.x);
A a = c;
System.out.println(c.x + " " + a.x);

--->
C C
C B
C A
 

hdi

Top Contributor
Genau, sag ich doch:

wird immer der Wert von derjenigen Klasse hergenommen, von deren allgemeinsten Typ das Objekt ist.

Also auf deutsch: Die Klasse, die links vom "=" stand als das Objekt erzeugt wurde.
 

Niki

Top Contributor
Der Typ bei der Erzeugung ist egal wie du bei dem Beispiel siehst. Der Typ auf den gecastet wird ist relevant. Von dem wird nämlich das Attribut genommen.
 

hdi

Top Contributor
Ja okay das mit dem "Objekt ist" ist falsch ausgdrückt. Aber wir meinen das gleiche.
Eben die Klasse, von deren Typ die Variable definiert wird (und nicht die Klasse deren Objekt dann
dort reingespeichert wird)
 

Ebenius

Top Contributor
hdi hat gesagt.:
Die Methode wert() in CKlasse überschreibt die Methode wert() in AKlasse.
Die Variable wert inCKlasse dagegen überschattet die Variable wert in AKLasse.
Ich bin begeistert... So stimmt's. :)

hdi hat gesagt.:
Also Methoden -> "Override"
und Attribute -> "Overload"
Einzig und allein der Terminologie wegen:
  • Methoden werden überschrieben → Override
  • Attribute werden überschattet → Shadowing
  • Operatoren werden überladen (was in Java nur für String der Fall ist) → Overload
Ebenius
 

Ebenius

Top Contributor
André Uhres hat gesagt.:
Ein Methodenname wird überladen (und dadurch mehrdeutig).
Stimmt, hätte ich noch hinzufügen sollen. Vor allem ging's mir darum, dass "Überladen" nicht das richtige Wort ist für das Verstecken von Attributen... :)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Fehlendes Verständnis für dynamische Bindung und Vererbung Java Basics - Anfänger-Themen 13
imocode Vererbung Problem mit Vererbung Java Basics - Anfänger-Themen 2
M Vererbung - Polymorphie Java Basics - Anfänger-Themen 37
L Java- Vererbung Java Basics - Anfänger-Themen 4
ineedhelpinjava Vererbung Java Basics - Anfänger-Themen 12
ineedhelpinjava Vererbung Java Basics - Anfänger-Themen 1
I JSON / XML Struktur mit Vererbung / Interfaces Java Basics - Anfänger-Themen 0
M Interface oder Vererbung? Java Basics - Anfänger-Themen 12
M Vererbung Java Basics - Anfänger-Themen 6
M Designentscheidung von Attributen/Methoden im Falle von Vererbung Java Basics - Anfänger-Themen 8
M Generics Vererbung Listen Java Basics - Anfänger-Themen 2
A Methoden Vererbung und Interface Java Basics - Anfänger-Themen 14
D Klassen und Vererbung Java Basics - Anfänger-Themen 2
U Vererbung Java Basics - Anfänger-Themen 7
D Vererbung Java Basics - Anfänger-Themen 3
K Schleife berechnet kein Ergebnis (Vererbung) Java Basics - Anfänger-Themen 6
00111010101 Objektorientiertes Programmieren mit Vererbung (Zahlen in Array verschwinden) Java Basics - Anfänger-Themen 3
W Zur Vererbung: Wann und wie? Java Basics - Anfänger-Themen 35
H Datenkapselung, Vererbung und UML Java Basics - Anfänger-Themen 16
districon Super-Stichwort/ Vererbung Java Basics - Anfänger-Themen 3
YaU Vererbung erstellt NullPointerException? Java Basics - Anfänger-Themen 4
1 Vererbung Klassenattribute Java Basics - Anfänger-Themen 9
TimoN11 Frage zu Java-Vererbung (Cast) Java Basics - Anfänger-Themen 5
N Thema Vererbung Java Basics - Anfänger-Themen 31
A Vererbung Vererbung Übung Java Basics - Anfänger-Themen 5
B Vererbung - Sichtbarkeitsmodifikation - protected Java Basics - Anfänger-Themen 10
B Best Practice Unschlüssig ob Vererbung oder Interface Java Basics - Anfänger-Themen 2
G Java Vererbung Java Basics - Anfänger-Themen 8
Y Vererbung Konto - Anfangsprobleme Java Basics - Anfänger-Themen 7
A Vererbung Klassen im Bezug auf Auto´s Java Basics - Anfänger-Themen 18
A Klassen Vererbung und zusätzliche Unterklassen Java Basics - Anfänger-Themen 23
M Vererbung mit Enums Java Basics - Anfänger-Themen 8
Kirby.exe Vererbung im Detail erklärt? Java Basics - Anfänger-Themen 9
N Modellierung, vererbung, Java Basics - Anfänger-Themen 163
W OOP Vererbung im Computerspiel Java Basics - Anfänger-Themen 7
J Probleme mit Vererbung Java Basics - Anfänger-Themen 4
I Vererbung Java Basics - Anfänger-Themen 13
W OOP Vererbung und Problem bei Zählschleife in einer Methode Java Basics - Anfänger-Themen 10
W Methoden Verständnisfrage Vererbung von Methoden Java Basics - Anfänger-Themen 14
V Vererbung Java Basics - Anfänger-Themen 2
J Frage zur Vererbung Java Basics - Anfänger-Themen 1
J Vererbung Java Basics - Anfänger-Themen 3
U Was löst meine NullPointerException aus? (Vererbung) Java Basics - Anfänger-Themen 12
O Vererbung Ueben mit kleiner Datenstruktur von Räumen Java Basics - Anfänger-Themen 10
O Umgang mit Vererbung verstehen Java Basics - Anfänger-Themen 4
A Vererbung/Interfaces/Generics Java Basics - Anfänger-Themen 12
O Vererbung änderung des Konstruktors Java Basics - Anfänger-Themen 8
L Vererbung Java Basics - Anfänger-Themen 5
E HashMap+Vererbung Java Basics - Anfänger-Themen 11
E Vererbung super-Methoden Aufruf Java Basics - Anfänger-Themen 3
B Java Vererbung Fragen (zu Code Beispiel) Java Basics - Anfänger-Themen 3
A Objekterstellung bei der Vererbung Java Basics - Anfänger-Themen 7
P Vererbung Warum funktioniert die Vererbung hier nicht Java Basics - Anfänger-Themen 14
S Vererbung Java mehrfach Java Basics - Anfänger-Themen 10
B Objekte zählen/ Vererbung/ Kopplung/ Interface/ Abstract Class Java Basics - Anfänger-Themen 5
A Klassen Vererbung privater Methoden und Member Java Basics - Anfänger-Themen 12
A Konstruktoren Vererbung Java Basics - Anfänger-Themen 3
ReinerCoder Vererbung von JFrame in einer Klasse entfernen Java Basics - Anfänger-Themen 5
W Vererbung, abstract und Konstruktoren Java Basics - Anfänger-Themen 30
J Vererbung und Methodenaufruf Java Basics - Anfänger-Themen 11
G Polymorphie, Vererbung, statischer Typ, Laufzeittyp Java Basics - Anfänger-Themen 2
H Vererbung mit private instanzvariablen Java Basics - Anfänger-Themen 9
S Vererbung Funktionsweise Code zur Vererbung Java Basics - Anfänger-Themen 1
C Methoden Vererbung private Attribute/public Methoden Java Basics - Anfänger-Themen 4
S Verständnis Vererbung Java Basics - Anfänger-Themen 3
D JavaFX Vererbung Java Basics - Anfänger-Themen 2
U Vererbung Generizität und Vererbung Java Basics - Anfänger-Themen 4
A Vererbung bei Klassen mit Objekt der Klasse im Konstruktor Java Basics - Anfänger-Themen 4
K Vererbung Octagon von Circle Java Basics - Anfänger-Themen 0
B Hilfe bei Vererbung Java Basics - Anfänger-Themen 2
D Vererbung Frage zum Klassenaufbau mit Vererbung Java Basics - Anfänger-Themen 1
T Vererbung und interface. Java Basics - Anfänger-Themen 1
S Gehaltsberechnung (Vererbung, abstrakte Methoden) Java Basics - Anfänger-Themen 6
S Vererbung Java Basics - Anfänger-Themen 1
F Vererbung in zwei Richtungen? Java Basics - Anfänger-Themen 14
D Vererbung / Polymorphie Java Basics - Anfänger-Themen 5
O Vererbung Java Basics - Anfänger-Themen 5
MiMa Vererbung Theorie OK, Praxis ?? Java Basics - Anfänger-Themen 4
Arif Vererbung Vererbung Variablen überschreiben Java Basics - Anfänger-Themen 1
C Vererbung - Ausgaben bestimmen Java Basics - Anfänger-Themen 6
S Vererbung Java Basics - Anfänger-Themen 10
L Setter und Getter/Vererbung Java Basics - Anfänger-Themen 6
C Konstruktoren und Vererbung Java Basics - Anfänger-Themen 2
J Kleinere Frage zur Vererbung/Objekterzeugung Java Basics - Anfänger-Themen 2
G Vererbung Java Basics - Anfänger-Themen 12
J Vererbung privater Variablen Java Basics - Anfänger-Themen 7
J Vererbung Vererbung von Methoden Java Basics - Anfänger-Themen 6
B Vererbung Java Basics - Anfänger-Themen 12
K Vererbung (super) Java Basics - Anfänger-Themen 2
A ArrayQueue mit Exceptions und Vererbung Java Basics - Anfänger-Themen 3
J Java: static bei Vererbung Java Basics - Anfänger-Themen 5
C Vererbung Java Basics - Anfänger-Themen 4
L Vererbung Java Basics - Anfänger-Themen 3
J Klassenorganisation | Vererbung Java Basics - Anfänger-Themen 1
B Vererbung Vererbung Java Basics - Anfänger-Themen 2
N Generics Vererbung Wildcard Interface Java Basics - Anfänger-Themen 8
A Benötige Hilfe bei Vererbung Java Basics - Anfänger-Themen 1
M Anfängerprobleme mit Vererbung Java Basics - Anfänger-Themen 27
J Vererbung Java Basics - Anfänger-Themen 9
F Vererbung von Attributen zwischen zwei Klassen Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben