Pourquoi les variables Instance d'une superclasse ne sont pas masquées dans Inheritance?Inheritance Java - Remplacement des variables d'instance
Répondre
Parce que l'héritage est destiné à modifier le comportement. Le comportement est exposé par des méthodes, et c'est pourquoi ils peuvent être remplacés.
Les champs ne sont pas un comportement mais un état. Vous n'avez pas besoin de modifier cela, ni les méthodes privées employées par la superclasse. Ils sont destinés à permettre à la superclasse de faire son travail.
Vous pouvez masquer un champ, mais pas outrepasser il. Le masquage signifie qu'un champ aura une valeur différente selon la classe à laquelle il a accédé. Le champ de la sous-classe "cachera" le champ dans la super-classe, mais les deux existent.
C'est une pratique extrêmement mauvaise pour cacher le terrain, mais fonctionne:
public class HideField {
public static class A
{
String name = "a";
public void doIt1() { System.out.println(name); };
public void doIt2() { System.out.println(name); };
}
public static class B extends A
{
String name = "b";
public void doIt2() { System.out.println(name); };
}
public static void main(String[] args)
{
A a = new A();
B b = new B();
a.doIt1(); // print a
b.doIt1(); // print a
a.doIt2(); // print a
b.doIt2(); // print b <-- B.name hides A.name
}
}
Selon que la méthode a été outrepassée, le champ dans A
ou B
est accessible.
Ne faites jamais ça! Ce n'est jamais la solution à votre problème et crée des bugs très subtils liés à l'héritage.
Parce que:
Il peut briser le code
parent class
. Par exemple, considérons le code suivant (Quel serait le comportement de la ligneobB.getInt();
dans le code suivant si, variables d'instance prépondérants est autorisé):class A { int aInt; public int getInt() { return aInt; } } class B extends A { int aInt; public int getInt2() { return aInt; } public static void main(String[] args) { B obB = new B(); //What would be behavior in following line if, //instance variables overriding is allowed obB.getInt(); } }
Il n'est pas logique parce
child class
devrait avoir/refléter tous les comportements deparent class
.
Ainsi, vous ne pouvez cacher les méthodes/variables héritées dans child class
mais ne peut pas override
.
Voici un extrait de Java doc from Oracle spécifiant quelle opération vous pouvez effectuer/attendre de child class
:
Vous pouvez utiliser les membres hérités est, les remplacer, les cacher, ou de les compléter avec de nouveaux membres :
- Les champs hérités peuvent être utilisés directement, comme tous les autres champs.
- Vous pouvez déclarer un champ dans la sous-classe avec le même nom que celui de la superclasse, le masquant (non recommandé).
- 1. Remplacement automatique des variables par #defines
- 2. remplacement variables sed
- 3. Java Inheritance doubt dans la collection paramétrée
- 4. Chaîne Java Remplacement des caractères spéciaux
- 5. inheritance: understanding
- 6. PHP Doctrine Inheritance
- 7. Java: Regex remplacement
- 8. Maven2 inheritance
- 9. Réutilisation du code Java via Inheritance lorsque des génériques sont impliqués (liste en particulier)?
- 10. Remplacement Class.getSuperclass() sur Java ME?
- 11. WCF et Inheritance
- 12. XMLSS Style Inheritance
- 13. PHP Inheritance et MySQL
- 14. javascript template inheritance
- 15. MVC View Inheritance
- 16. NHibernate Inheritance Mapping
- 17. Windows Form inheritance
- 18. NHibernate Inheritance - Discriminator-Value
- 19. Metaclass à paramétrer Inheritance
- 20. Directive ASP.NET @OuputCache "Inheritance"
- 21. wpf - UserControl inheritance
- 22. java beginner: initialisation des variables de classe
- 23. aide avec des variables statiques en Java
- 24. Java - Classe abstraite pour contenir des variables?
- 25. Passer des variables dans un Java ActionListener?
- 26. Java accédant à des variables en utilisant
- 27. Puis-je surcharger des variables en Java?
- 28. MongoMapper Parent Inheritance
- 29. Unit Tests inheritance
- 30. JPA Inheritance Multiple DiscriminatorValues
Oh pour les upvotes multiples pour le conseil impératif de ne pas faire cela. C'est un peu comme un seigneur maléfique se transformant en serpent ... Cela n'aide jamais. –
Il y a des raisons subtiles pour lesquelles vous aimeriez: en particulier avec les champs de classe statique auxquels vous accédez en utilisant spécifiquement le nom de super ou de sous-classe. "Jamais" n'est jamais une bonne chose à dire;) – RichieHH
L'utilisation de static est totalement autre chose, Oracle a la même suggestion avec @ewernli: http://docs.oracle.com/javase/tutorial/java/IandI/hidevariables.html – MengT