Java classe abstraite champs remplacer
J'ai une classe abstraite qui doit mettre en œuvre un champ public, ce domaine est une interface ou d'une autre classe abstraite.
quelque chose comme ceci:
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;
}
Maintenant j'ai une autre classe spécialisée Conteneur:
public abstract class SpecialContainer extends GenericContainer {
public SpecialChild child=new SpecialChild(); //PAY ATTENTION HERE!
}
Java permettez-moi de le compiler, et j'IMAGINE que le champ child
dans SpecialContainer
est automatiquement surcharger le champ child
de la GenericContainer
...
Les questions sont:
Suis-je le droit? L'automatique "surcharge" de l'enfant qui va arriver?
Et, plus important question, si j'ai une autre classe comme ceci:
public class ExternalClass {
public GenericContainer container=new SpecialContainer();
public int test() {
return container.child.prop1
}
}
test()
sera de retour 1 ou 2? je veux dire le GenericContainer
champ de conteneurs ce prop1
appeler, le générique ou le spécial?
Et quoi de si spécial prop1 a été déclaré comme une Chaîne de caractères (oui java me permettre de compiler aussi dans ce cas)?
Merci!
Donc, si dans "SpecialChild" j'ai une méthode qui utilisent prop1, ce qu'il obtiendra au premier appel? 1 ou 2? J'ai essayé et la suppression de prop1 de SpecialChild va me permettre d'écrire une méthode dans SpecialChild qui utilisent prop1 aussi, si c'est uniquement définie en GenericChild... Donc je pense que une sorte de surcharge se passe...
vous pouvez toujours essayer exécution.
Programme ci-dessus jette "NullPointerException". Pour la question, la réponse est les champs ne peuvent pas être redéfinies. Si vous définissez un même nom de champ dans la sous-classe puis une sous-classe de champ permet de masquer la classe super champ.
oui, parce que dans le GenericContainer je n'ai pas initialisé Générique de l'enfant. sur mon projet complet qui il a travaillé.
OriginalL'auteur Alex | 2013-03-09
Vous devez vous connecter pour publier un commentaire.
Il n'est pas primordial rien, vous êtes juste cacher le champ d'origine à la classe actuelle portée. Si vous utilisez une variable avec le sous-type, vous serez toujours en mesure d'accéder à la propriété d'origine. Exemple:
Cette affiche 1 puis 2.
De
SpecialChild
vous serait également en mesure de remonter d'un niveau à l'aide desuper
:OriginalL'auteur Maurício Linhares
En Java, les membres de données/attributs ne sont pas polymorphes. La surcharge signifie qu'un champ aura une valeur différente en fonction de la classe à laquelle il accède. Le champ dans la sous-classe d' cacher le champ dans la super-classe, mais les deux existe. Les champs sont appelées en fonction des types de référence, tandis que les méthodes sont utilisées de l'objet réel. Vous pouvez essayer vous-même.
Elle est appelée, la variable de cacher le jumelage, pour plus de détails sur ici
OriginalL'auteur Abimaran Kugathasan
Concernant
Pas. Les champs n'obtenez pas remplacées, les seules méthodes pour le faire.
C'est une des raisons pourquoi l'utilisation de (substituables) getter et setter sont préférés pour un accès direct aux champs. Vos champs sont presque toutes privées.
Comme pour votre design, il n'y a pas besoin de votre SpecialContainer classe d'avoir un SpecialChild champ, mais au lieu de la SpecialChild objet doit être placé dans le GenericChild champ.
OriginalL'auteur Hovercraft Full Of Eels
Tout d'abord, l'Héritage ne s'applique pas à des variables. Champs(Insatnce variables) ne sont pas remplacées dans votre sous-classe.ils ne sont visibles que dans votre sous-classe si ils sont marqués avec
public, protected or default
.OriginalL'auteur PermGenError
Pour répondre à votre question, il maintient les deux cas. Et selon la façon dont vous vous référez à l'conteneur (soit par le biais de l'abstrait ou le impl) détermine la variable qui vous faites allusion.
La grande question est, pourquoi voulez-vous concevoir quelque chose comme ça? Je suis en supposant que vous demandez à partir d'un point de vue théorique.
Mes 2 cents, ce n'est pas génial OO design. Vous serait mieux de faire les variables publiques et privées en cédant leurs valeurs par le biais d'un constructeur ou le setter de la propriété. Que-est, il va conduire à des résultats inattendus dans votre code.
OriginalL'auteur J. Rambo
Pourquoi personne n'est à observer que le programme va jeter
NullPointerException
.sous-classe de
field
avec le même nom permet de masquer la classe superfield
. Il n'y a pas deoverriding
avecfield
. Primordial est seulement possible avec des méthodes.Code d'origine de l'Auteur:
OriginalL'auteur AmitG