Ich habe eine abstrakte Klasse, die ein öffentliches Feld implementieren soll, dieses Feld ist eine Schnittstelle oder eine andere abstrakte Klasse.
etwas wie das:
%Vor%Jetzt habe ich eine andere spezialisierte Klasse Container:
%Vor% Java erlauben mir, dies zu kompilieren, und ich IMAGINE, dass das Feld child
in SpecialContainer
automatisch überlädt das Feld child
der GenericContainer
...
Die Fragen sind:
Bin ich richtig? Das automatische Überladen von Kind wird passieren?
Und, wichtigere Frage, wenn ich eine andere Klasse wie diese habe:
%Vor% test()
gibt 1 oder 2 zurück? ich meine das GenericContainer
container Feld was prop1
aufrufen wird, das generische oder das spezielle?
Und was ist, wenn das spezielle prop1 als String deklariert wurde (ja, java darf ich auch in diesem Fall kompilieren)?
Danke!
Es überschreibt nichts, Sie verstecken nur das ursprüngliche Feld im aktuellen Klassenbereich. Wenn Sie eine Variable mit dem Subtyp verwenden, können Sie weiterhin auf die ursprüngliche Eigenschaft zugreifen. Beispiel:
%Vor%Dies druckt 1 und dann 2.
Von SpecialChild
aus könntest du mit super
auch eine Ebene höher gehen:
In Java sind Datenelemente / Attribute nicht polymorph. Überladen bedeutet, dass ein Feld einen anderen Wert hat, abhängig davon, auf welche Klasse zugegriffen wird. Das Feld in der Unterklasse versteckt das Feld in der Superklasse, aber beide existieren. Die Felder werden basierend auf Referenztypen aufgerufen, während Methoden des tatsächlichen Objekts verwendet werden . Sie können es selbst ausprobieren.
Es heißt, variable Verstecke / Schatten, für weitere Details schauen Sie hier
Betreffend
.... und ich IMAGINE, dass das Feld "Kind" in SpecialContainer das Feld "Kind" des GenericContainer ... automatisch überlädt ...
Nein. Felder werden nicht überschrieben, nur Methoden.
Dies ist ein Grund, warum die Verwendung von (überschreibbaren) Getter- und Setter-Methoden bevorzugt wird, um den Zugriff auf Felder zu steuern. Ihre Felder sollten fast alle privat sein.
Wie für Ihr Design muss Ihre SpecialContainer-Klasse kein SpecialChild-Feld haben, stattdessen sollte das SpecialChild-Objekt in das GenericChild-Feld eingefügt werden.
Java erlauben mir, dies zu kompilieren, und ich IMAGINE, dass das Feld "Kind" in SpecialContainer überlädt automatisch das Feld 'Kind' des GenericContainer ...
Erstens gilt Inheritance nicht für Variablen. Felder (Instince-Variablen) werden in Ihrer Unterklasse nicht überschrieben.Sie sind nur in Ihrer Unterklasse sichtbar, wenn sie mit public, protected or default
markiert sind.
Um Ihre Frage zu beantworten, werden beide Instanzen verwaltet. Und abhängig davon, wie Sie sich auf den Container beziehen (entweder über das Abstract oder das Impl), bestimmen Sie, auf welche Variable Sie sich beziehen.
%Vor%Die größere Frage ist, warum würden Sie so etwas entwerfen? Ich nehme an, Sie fragen sich aus einer theoretischen Perspektive.
Meine 2 Cent, das ist kein großartiges OO-Design. Sie sollten die öffentlichen Variablen besser privat machen und ihre Werte über einen Konstruktor oder einen Property Setter zuweisen. So wie es ist, wird es zu unerwarteten Ergebnissen in Ihrem Code führen.
Warum niemand dieses Programm beobachtet, wird NullPointerException
ausgeben.
Unterklasse field
mit demselben Namen wird die Klasse field
der Oberklasse verbergen. Es gibt keine overriding
mit field
. Das Überschreiben ist nur mit Methoden möglich.
Ursprünglicher Code nach Autor:
%Vor%