Java abstrakte Klassenfelder überschreiben

8

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!

    
Alex 09.03.2013, 14:25
quelle

6 Antworten

8

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:

%Vor%     
Maurício Linhares 09.03.2013, 14:33
quelle
13

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

    
Abimaran Kugathasan 09.03.2013 14:29
quelle
2

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.

    
Hovercraft Full Of Eels 09.03.2013 14:27
quelle
1
  

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.

    
PermGenError 09.03.2013 14:27
quelle
1

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.

    
J. Rambo 09.03.2013 14:43
quelle
1

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%     
AmitG 09.03.2013 15:25
quelle

Tags und Links