Java abstract class-Felder überschreiben
Ich habe eine abstrakte Klasse implementieren sollte ein öffentliches Feld, dieses Feld ist ein interface oder eine abstrakte Klasse.
etwas wie dieses:
public abstract class GenericContainer {
public GenericChild child;
}
public abstract class GenericChild {
public int prop1=1;
}
public abstract class SpecialChild extend GenericChild {
public int prop1=2;
}
Nun habe ich noch eine spezielle Klasse Container:
public abstract class SpecialContainer extends GenericContainer {
public SpecialChild child=new SpecialChild(); //PAY ATTENTION HERE!
}
Java erlauben Sie mir kompiliert das, und ich kann mir VORSTELLEN, dass das Feld child
im SpecialContainer
wird automatisch eine überlastung der Bereich child
des GenericContainer
...
Die Fragen sind:
Bin ich richtig auf dieser? Die automatische 'überlastung' von Kind passieren wird?
Und, die wichtigere Frage, wenn ich in einer anderen Klasse wie folgt aus:
public class ExternalClass {
public GenericContainer container=new SpecialContainer();
public int test() {
return container.child.prop1
}
}
test()
1 zurück oder 2? ich meine die GenericContainer
container-Feld, was prop1
nennen wird, die Allgemeinen oder die besonderen?
Und was ist, wenn der Besondere prop1 erklärt wurde, als String (ja, java erlauben Sie mir zu kompilieren, auch in diesem Fall)?
Dank!
Also, wenn 'SpecialChild' ich habe eine Methode, die mit prop1, was es wird beim ersten Aufruf? 1 oder 2? Ich habe versucht, und entfernen prop1 von SpecialChild wird mir erlauben, zu schreiben, eine Methode, die in SpecialChild, dass die Verwendung prop1 auch wenn diese nur definiert in GenericChild... Also ich denke, eine Art von überlastung passiert...
Sie könnten immer versuchen, die ausführen.
Über das Programm wirft "NullPointerException". Für die Frage, die Sie gefragt, seine Antwort-Felder können nicht überschrieben werden. Wenn Sie definieren, die gleichen Feldnamen in der Unterklasse dann Unterklasse Feld verstecken super-Klasse-Feld.
ja, weil in der GenericContainer ich habe nicht initialisiert Generischer Kind. auf meinem komplette Projekt gearbeitet.
InformationsquelleAutor Alex | 2013-03-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist es nicht überschreiben alles, du bist einfach ausblenden das ursprüngliche Feld an der aktuellen Klasse Anwendungsbereich. Wenn Sie eine variable mit dem Subtyp werden Sie immer noch Zugriff auf die ursprüngliche Eigenschaft. Beispiel:
Diese Drucke 1 und dann 2.
Vom
SpecialChild
würden Sie auch in der Lage sein zu gehen bis eine Ebene mitsuper
:InformationsquelleAutor Maurício Linhares
In Java, Daten-Elemente/Attribute sind nicht polymorph. Überladen bedeutet, dass ein Feld einen unterschiedlichen Wert haben, je nachdem, aus welcher Klasse auf Sie zugegriffen wird. Das Feld in der Unterklasse wird verstecken das Feld in der super-Klasse, aber beide vorhanden. Die Felder sind aufgerufen, basierend auf den Referenz-Typen, während Methoden verwendet werden, der tatsächlichen Objekt. Sie können es selbst ausprobieren.
Es heißt, die variable ausblenden/shadowing, für weitere details schauen Sie auf hier
InformationsquelleAutor Abimaran Kugathasan
Bezüglich
Nicht. Felder erhalten nicht überschrieben, nur die Methoden nicht.
Dies ist ein Grund, warum die Verwendung von (überschreibbare) - getter-und setter-Methoden bevorzugt werden, um direkten Zugriff auf die Felder. Ihre Felder, die fast alle privat sind.
Als für Ihr design, es gibt keine Notwendigkeit für Ihre SpecialContainer Klasse SpecialChild Feld, sondern die SpecialChild Objekt platziert werden soll in der GenericChild Feld.
InformationsquelleAutor Hovercraft Full Of Eels
Erstens, Inheritence gilt nicht für Variablen. Felder(Insatnce Variablen) nicht überschrieben sind in Ihrer sub-Klasse.Sie sind nur sichtbar in Ihrer Unterklasse, wenn Sie gekennzeichnet sind mit entweder
public, protected or default
.InformationsquelleAutor PermGenError
Deine Frage zu beantworten es unterhält beiden Instanzen. Und je nachdem, wie Sie beziehen sich auf den container (entweder durch die abstrakten oder die impl) bestimmt die variable, auf die Sie sich beziehen.
Die größere Frage bei der hand ist, warum würden Sie das design so etwas? Ich gehe davon aus, du fragst aus einer theoretischen Perspektive.
My 2 cents, das ist nicht toll, OO-design. Sie wäre besser dran, die privaten und öffentlichen Variablen zuweisen, deren Werte durch einen Konstruktor-oder property-setter. Als-ist, wird es zu unerwarteten Ergebnissen führen, die in Ihrem code.
InformationsquelleAutor J. Rambo
, Warum niemand die Beobachtung, dass das Programm werfen
NullPointerException
.Unterklasse ist
field
mit demselben Namen verstecken super Klassefield
. Es gibt keineoverriding
mitfield
. Das überschreiben ist nur möglich, mit den Methoden.Original-Code von Autor:
InformationsquelleAutor AmitG