Gedanken zur Vererbung

Status
Nicht offen für weitere Antworten.

yeTh7

Mitglied
Hi!

Nachdem ich immer versuche die Logik hinter den Spracheigenschaften zu verstehen, was mir auch sehr beim Erlernen von Java geholfen hat, bin ich nun auf ein paar Fragen gestossen wozu ich gerne mal eure Meinung hören würde. ;)

Und zwar ist mir folgendes aufgefallen:
Erste Frage:

Dem Polymorphismus zufolge ruft dieses Konstrukt ...
Code:
class Ober {
 int i = 3;

  void bla() {
    // tut irgendwas
  }
}

class Unter extends Ober {
  int i = 5;

  void bla() {
    // macht es noch viel besser
  }
}

...

Ober o = new Unter();
o.bla();
... die (evtl. überschriebene) bla() Methode in Unter auf. - logisch

Wenn man jetzt nach dieser Logik geht dann müsste doch das hier
Code:
System.out.println(o.i);
5 ergeben. Aber nein... es verhält sich als ob der Typ statisch wäre und gibt das i vom Ober Objekt aus.

Ich kann nicht ganz nachvollziehen warum... jemand mit mehr Ahnung hier? ;)

____________________________
Zweite Frage:

Code:
class Ober {
  void foo() {
    write();
  }
  
  void write() {
    System.out.println("ich bin die oberklasse");
  }
}

class Unter extends Ober {
  void write() {
    System.out.println("ich bin die unterklasse");
  }
}

...

Ober o = new Unter();
o.foo();

Hier wird "ich bin die unterklasse" ausgegeben obwohl foo() nur in der Oberklasse verfügbar ist und man denken könnte dass dieser also auch die Methode aus der selben Klasse verwendet. OK, es ist aber noch nachvollziehbar wenn man davon ausgeht, dass einfach immer die aktuellste Methode verwendet werden soll.

Was mich allerdings stört ist das hier:
Code:
class Ober {
  Ober() {
    write();
  }
  
  void write() {
    System.out.println("ich bin die oberklasse");
  }
}

class Unter extends Ober {
  void write() {
    System.out.println("ich bin die unterklasse");
  }
}

...

Ober o = new Unter();

Sogar hier wird das write() aus der erbenden Klasse aufgerufen, wo doch der Kosntruktor aus Ober eben das "obere Objekt" initialisieren soll.



Naja... das wärs erstmal, für Denkanstösse wär ich euch dankbar! ;)
 

Wildcard

Top Contributor
1.) Variablen können nicht überschrieben werden. Unter anderem deshalb sollte man Variablen auch private machen und getter/setter verwenden
2.) Naja, so funktioniert die Sache nunmal. Wenn eine Methode überschrieben wird, ist sie überschrieben. Schau dir zu dem Thema mal single- vs. double bzw. multiple dispatch an, dann wird erstens die Sache klarer und dir fällt zweitens eine weitere kleine Merkwürdigkeit auf :wink:
 

yeTh7

Mitglied
Wildcard hat gesagt.:
1.) Variablen können nicht überschrieben werden. Unter anderem deshalb sollte man Variablen auch private machen und getter/setter verwenden
Aber wieso ist das Ergebnis dann 3?
Ober o = new Unter();
o.i

Warum gehört i plötzlich zum statischen Typ der Objektvariable wo doch ein Unter Objekt tatsächlich dran hängt? :?:
 

Wildcard

Top Contributor
yeTh7 hat gesagt.:
Aber wieso ist das Ergebnis dann 3?
Ober o = new Unter();
o.i
Weil Variablen nicht überschrieben werden können. Der Variablentyp ist Ober. Also greift er auf das Feld i von Ober zurück. Unter hat ein super.i und ein this.i, beide mit unterschiedlichem Inhalt.
Sehr hässlich sowas, deshalb private :wink:
 

yeTh7

Mitglied
Wildcard hat gesagt.:
Weil Variablen nicht überschrieben werden können. Der Variablentyp ist Ober. Also greift er auf das Feld i von Ober zurück. Unter hat ein super.i und ein this.i, beide mit unterschiedlichem Inhalt.
Sehr hässlich sowas, deshalb private :wink:
Ahh... jetz is es klar... hier greift also der Polymorphismus nicht... :)

Nur noch eines: macht man alle Methoden static, dann wird durch Unter.foo() auch das write() aus Ober aufgerufen... sehr verwirrend das alles... ;)
 

Murray

Top Contributor
yeTh7 hat gesagt.:
Nur noch eines: macht man alle Methoden static, dann wird durch Unter.foo() auch das write() aus Ober aufgerufen... sehr verwirrend das alles... ;)
Weil statische Methoden ebensowenig überschrieben werden können wie Variablen.
 

yeTh7

Mitglied
Murray hat gesagt.:
Weil statische Methoden ebensowenig überschrieben werden können wie Variablen.
Naja, überschrieben können sie ja schon werden, denn ich kann sie einfach in der erbenden Klasse neu deklarieren und werden dann auch in jedem Objekt von diesem Typ herangezogen... nur scheint das eben bei Polymorphsimus und bei statischen Geschichten die Ausnahme zu bilden.
 

hupfdule

Top Contributor
yeTh7 hat gesagt.:
Was mich allerdings stört ist das hier:
Code:
class Ober {
  Ober() {
    write();
  }
  
  void write() {
    System.out.println("ich bin die oberklasse");
  }
}

class Unter extends Ober {
  void write() {
    System.out.println("ich bin die unterklasse");
  }
}

...

Ober o = new Unter();

Sogar hier wird das write() aus der erbenden Klasse aufgerufen, wo doch der Kosntruktor aus Ober eben das "obere Objekt" initialisieren soll.

Der Grund ist, dass du in Unter keinen eigenen Konstruktor angegeben hast. Damit wird der Vaterkonstruktor verwendet (klappt nur bei Defaultkonstruktoren oder indem du eplizit super(..) aufrufst). Und in diesem steht write(). Diese Methode wurde überschrieben, also wird die überschriebene verwendet.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Erste Schritte Fehlender Gedanken-Ansatz bei Interpretation von Daten Allgemeine Java-Themen 1
U Vererbung?! Allgemeine Java-Themen 15
temi Problem mit Aufrufreihenfolge bei Vererbung Allgemeine Java-Themen 3
MiMa Vererbung und Komposition?? Allgemeine Java-Themen 38
Kirby.exe Vererbung bei Generics Allgemeine Java-Themen 7
L Vererbung Verständnis Probleme Vererbung Allgemeine Java-Themen 2
W Generics + Vererbung Allgemeine Java-Themen 47
M Vererbung mithilfe von Bluej Allgemeine Java-Themen 3
M List -Tableview-Javafx-Vererbung Allgemeine Java-Themen 35
A Vererbung Selbstreferenzparameter Allgemeine Java-Themen 14
D Thema: Vererbung Ober-/Unterklassen Allgemeine Java-Themen 16
D Frage zu Vererbung Allgemeine Java-Themen 5
N Vererbung mit GUI Allgemeine Java-Themen 9
E Vererbung Countable mit Vererbung Allgemeine Java-Themen 6
J 2 Fragen zur Vererbung Allgemeine Java-Themen 5
T Javaklassen und vererbung Allgemeine Java-Themen 32
F Vererbung Allgemeine Java-Themen 5
Neumi5694 Vererbung Restriktive Vererbung Allgemeine Java-Themen 4
A Vererbung Übungsaufgabe Vererbung - Erstellung Klassenhierarchie Allgemeine Java-Themen 1
J Allgemeine Fragen zu Vererbung Allgemeine Java-Themen 1
kaoZ Generics und Vererbung Allgemeine Java-Themen 3
D Problem bei Vererbung abstrakter Klassen Allgemeine Java-Themen 6
D Object nach Vererbung mit Class Object überprüfen Allgemeine Java-Themen 4
T Super Klasse Vererbung Problem :/ Allgemeine Java-Themen 10
L Unabhängige Auslieferung bei Vererbung Allgemeine Java-Themen 20
S MVC - Vererbung Allgemeine Java-Themen 4
C Enums und Vererbung Allgemeine Java-Themen 6
F Google Guice + Generics + Vererbung Allgemeine Java-Themen 5
D Unterschied Vererbung und Polymorphie? Allgemeine Java-Themen 4
K Vererbung ohne Basisklasse zu kennen Allgemeine Java-Themen 20
Da_Tebe ArrayList<xyz> Verschachtelung oder Vererbung? Allgemeine Java-Themen 6
faetzminator statische Variablen in Interface - Vererbung? Allgemeine Java-Themen 9
M OOP PropertyChangeListener - Vererbung oder Komposition? Allgemeine Java-Themen 5
S OOP Mehrfache Vererbung von abstrakten Klassen Allgemeine Java-Themen 7
G Designfrage Vererbung ja oder nein Allgemeine Java-Themen 9
S equals - Identität ändern bei Vererbung? Allgemeine Java-Themen 5
dayaftereh Vererbung Hilfe Allgemeine Java-Themen 2
D Vererbung, Reflection und automatischer Methodenaufruf Allgemeine Java-Themen 24
A PropertyChangeListener Vererbung Allgemeine Java-Themen 4
P DefaultTreeCellRenderer Vererbung Allgemeine Java-Themen 5
S Objekte die Objekte enthalten: Keine Vererbung Allgemeine Java-Themen 4
J Vererbung bei abstrakten Klassen Allgemeine Java-Themen 2
S Vererbung: Welche Methode wird verwendet? Allgemeine Java-Themen 9
L Checkstyle: Wann ist eine Methode für Vererbung entworfen? Allgemeine Java-Themen 13
S normale vererbung als interface Allgemeine Java-Themen 2
S statische Methoden und Vererbung Allgemeine Java-Themen 6
R Vererbung - doppelte Paint-Methode Allgemeine Java-Themen 4
R Vererbung mit Interface und Abstract Allgemeine Java-Themen 3
B Vererbung bei enums ? Allgemeine Java-Themen 3
W Frage zu Vererbung / konkretes Beispiel Allgemeine Java-Themen 4
F Vererbung von SessionBeans Allgemeine Java-Themen 3
O abstract, privat, Vererbung Allgemeine Java-Themen 29
L Annotations mit Vererbung Allgemeine Java-Themen 4
M Singleton und Vererbung? Allgemeine Java-Themen 45
T Problem mit Vererbung Allgemeine Java-Themen 3
V Vererbung und Schleifen Allgemeine Java-Themen 5
C Comparable + Vererbung Funktioniert nicht? Allgemeine Java-Themen 4
A Ansatz Objektorientierung, Methoden Vererbung Allgemeine Java-Themen 2
D Listen von Generischen Typen inkl. Vererbung Allgemeine Java-Themen 2
D Zugriffsmethode nach Vererbung ändern? Allgemeine Java-Themen 5
S Vererbung in UML Allgemeine Java-Themen 3
T Nochmal Frage zu Vererbung Interfaces etc. Allgemeine Java-Themen 10
F Vererbung, Generizität und Collections. Allgemeine Java-Themen 7
G Frage zu statischen Variablen bei Vererbung Allgemeine Java-Themen 15
F Vererbung Allgemeine Java-Themen 5
S Vererbung von mehreren Klassen? Allgemeine Java-Themen 5
C enum und Vererbung Allgemeine Java-Themen 3
K Problem mit Vererbung - Kein wirklicher Nutzen. Allgemeine Java-Themen 10
G vererbung vs benutzung Allgemeine Java-Themen 7
L Vererbung klappt nicht Allgemeine Java-Themen 5
W Probleme mit Arrays und Vererbung ! Allgemeine Java-Themen 5
M vererbung einer "selbst-instanzierungs-klasse" Allgemeine Java-Themen 16
J Vererbung. Allgemeine Java-Themen 8
H Frage zur Vererbung Allgemeine Java-Themen 5
S private Instanzvaribalen bei "Innerer-Vererbung" Allgemeine Java-Themen 9
H Vererbung auch ohne erzeugung einer Instanz möglich? Allgemeine Java-Themen 3
M frage zur vererbung Allgemeine Java-Themen 12
G Generics und Vererbung. Allgemeine Java-Themen 21
M Vererbung von Hashtables Allgemeine Java-Themen 5
C dynamische Vererbung Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben