Sont statiques les méthodes héritées en Java?
Je lisais Un Guide du Programmeur
Java™ Certification SCJP par Khalid Moghol.
Dans l'Héritage chapitre, il explique que
Héritage de membres est étroitement liée à leurs déclaré
l'accessibilité. Si un membre de la superclasse est accessible par son simple nom
dans la sous-classe (sans l'utilisation d'appoint, la syntaxe, le super), qui
membre est considéré comme héréditaire
Il mentionne également que les méthodes statiques ne sont pas héritées. Mais le code ci-dessous est perfectlly amende:
class A
{
public static void display()
{
System.out.println("Inside static method of superclass");
}
}
class B extends A
{
public void show()
{
//This works - accessing display() by its simple name -
//meaning it is inherited according to the book.
display();
}
}
Comment suis-je capable d'utiliser directement display()
dans la classe B
? Même plus, B.display()
fonctionne également.
Le livre de l'explication s'appliquent uniquement à des méthodes d'instance?
- stackoverflow.com/questions/4716040/... a une info intéressante.
- Ce n'est pas ce qu'il dit dans mon exemplaire, 1ère édition. Veuillez fournir une offre de prix.
- connexes: stackoverflow.com/questions/25169175/...
Vous devez vous connecter pour publier un commentaire.
Toutes les méthodes qui sont accessibles sont héritées par les sous-classes.
De Sun Java Tutoriels:
La seule différence avec un héritage statique (la classe) des méthodes et des hérité de non-statique (par exemple) des méthodes est que lorsque vous écrivez une nouvelle méthode statique avec la même signature, la vieille méthode statique est juste caché, elle n'est pas remplacée.
De la page sur la différence entre le remplacement et la clandestinité.
Si c'est ce que le livre dit vraiment, c'est mal.[1]
La Java Langage De Spécification #8.4.8 états:
[1] Cela ne veut pas dire que dans ma copie, 1ère édition, 2000.
Vous pouvez faire l'expérience de la différence dans le code suivant, qui est en légère modification au cours de votre code.
Cela est dû à des méthodes statiques sont des méthodes de classe.
A. afficher() et B. afficher() va appeler la méthode de leurs classes respectives.
B. display() fonctionne parce que statique de la déclaration rend la méthode/membre d'appartenir à la classe, et pas tout particulier instance de classe (aka Objet). Vous pouvez en lire plus à ce sujet ici.
Une autre chose à noter est que vous ne pouvez pas remplacer une méthode statique, vous pouvez avoir votre sous-classe de déclarer une méthode statique avec la même signature, mais son comportement peut être différent de ce que vous attendez. C'est probablement la raison pour laquelle il n'est pas considéré comme héréditaire. Vous pouvez consulter le scénario qui pose problème et l'explication ici.
Ce concept n'est pas si facile qu'il y paraît. Nous pouvons accéder à des membres statiques sans héritage, qui est HasA-relation. Nous pouvons accéder à des membres statiques par l'extension de la classe parent aussi. Cela ne signifie pas qu'il est un ISA-relation (Héritage). En réalité statique membres appartiennent à la classe, et statique n'est pas un modificateur d'accès. Tant que les modificateurs d'accès permettent d'accéder à la statique des membres, nous pouvons les utiliser dans d'autres classes. Comme si il est public, alors il sera accessible à l'intérieur de la même package et aussi à l'extérieur de l'emballage. Pour le privé, nous ne pouvons pas l'utiliser n'importe où. Par défaut, nous pouvons l'utiliser uniquement à l'intérieur de l'emballage. Mais pour les protégés, nous devons étendre la super-classe. Afin d'obtenir la méthode statique à d'autres classe ne dépend pas être Statique. Cela dépend des modificateurs d'Accès. Donc, à mon avis, les membres Statiques ne peuvent accéder si les modificateurs d'accès le permettent. Sinon, on peut les utiliser comme nous utilisons par Hasa-relation. Et a une relation n'est pas l'héritage. Encore une fois nous ne peut pas remplacer la méthode statique. Si nous pouvons utiliser une autre méthode, mais ne peux pas le remplacer, alors il est HasA-relation. Si nous ne pouvons pas nous substituer à eux, il ne sera pas l'héritage.Ainsi l'auteur a été de 100% correct.
Méthodes statiques sont hérités en Java, mais ils ne prennent pas part au polymorphisme. Si nous essayons de remplacer les méthodes statiques ils vont tout simplement cacher la super-classe des méthodes statiques au lieu de leur remplaçant.
Méthode statique est héréditaire dans la sous-classe, mais il n'est pas le polymorphisme. Quand on écrit de la mise en œuvre de la méthode statique, le parent de la méthode de la classe est plus cachée, elle n'est pas remplacée. Pense que, si elle n'est pas héréditaire, alors comment vous pouvez être en mesure d'accéder sans
classname.staticMethodname();
?Tous les publics et protégés des membres peut être hérité de toute la classe alors que le défaut ou le package membres peuvent également être héritée de la classe dans le même package que celui de la super-classe. Il ne dépend pas de savoir si c'est statique ou non membre statique.
Mais il est également vrai que la fonction membre statique ne participent pas à la liaison dynamique. Si la signature de la méthode statique est la même dans les deux parent et de l'enfant de la classe des concept de l'observation s'applique, pas de polymorphisme.
Vous pouvez remplacer les méthodes statiques, mais si vous essayez d'utiliser le polymorphisme, alors qu'ils travaillent selon leur catégorie, leur champ d'application(Contrairement à ce qu'on attend normalement).
DANS le premier cas, o/p est la "en statique méthode de B" # réussie remplacer
Dans le 2e cas, o/p est "dans méthode statique d'Un" # méthode Statique - n'envisagera pas de polymorphisme
Méthodes statiques en Java sont héréditaires, mais ne peut pas être remplacée. Si vous déclarez la même méthode dans une sous-classe, vous cachez la méthode de superclasse au lieu de passer outre. Les méthodes statiques ne sont pas polymorphes. Au moment de la compilation, la méthode statique sera lié statiquement.
Exemple:
Vous aurez la suivante:
Nous pouvons déclarer des méthodes statiques avec la même signature dans la sous-classe, mais il n'est pas considéré comme primordial car il n'y aura pas de polymorphisme de l'exécution.Parce que depuis que tous les membres statiques d'une classe sont chargés dans le moment de chargement de classe de sorte qu'il décide au moment de la compilation(et ignorer au moment de l'exécution) d'Où la réponse est "Non".
Beaucoup ont exprimé leur répondre en deux mots. C'est une longue explication des codes:
Résultats:
Donc, c'est la conclusion:
null
instance. Ma conjecture est que le compilateur utilisera le type de variable de trouver la classe lors de la compilation, et de le traduire appropriée, la méthode statique appel.Membres statiques sont universels membres. Ils peuvent être accessibles à partir de n'importe où.
Membres statiques ne sera pas hérité de la sous-classe, car l'héritage est seulement pour les non-membres statiques..
Membres statiques et sera chargé à l'intérieur statique de la piscine par le chargeur de classes. L'héritage est seulement pour ceux des membres qui sont chargés à l'intérieur de l'objet