134 votes

Les méthodes statiques sont-elles héritées en Java?

Je lisais Un Guide du Programmeur Java™ Certification SCJP par Khalid Moghol.

Dans l'Héritage chapitre, il est écrit que

L'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 est également mentionné que les méthodes statiques ne sont pas héritées. Mais le code ci-dessous est perfectlly fine:

class A
{
public static void display()
{
  System.out.println("Inside static method of superclass");
}
}

class B extends A
 {
 public void show()
  {
    display(); //This works..Accessible by its simple name... meaning inherited as per in book      
  }
 }

Le point ici est que la façon dont je suis capable d'utiliser directement afficher() de la Classe B? Encore plus B. display() fonctionne aussi.

N'texte ci-dessus ne s'applique qu'aux méthodes d'instance?

173voto

yincrash Points 2344

Toutes les méthodes qui sont accessibles sont héritées par les sous-classes.

De Sun Java Tutoriels:

Une sous-classe hérite de l'ensemble du public et des membres de son parent, n'importe quel paquet de la sous-classe. Si la sous-classe est dans le même package que sa mère, il hérite également du colis-privé des membres de la société mère. Vous pouvez utiliser la les membres hérités comme c'est, remplacer, les cacher ou de les compléter par de nouveaux membres

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.

À partir de la page sur la différence entre le remplacement et la clandestinité.

La distinction entre la clandestinité et dominante qui a des implications importantes. La version de la méthode de remplacement qui est appelé est celui de la sous-classe. La version de caché méthode qui est appelé dépend si elle est appelée à partir de la super-classe ou la sous-classe. Regardons un exemple qui contient deux classes. La première est l'Animal, qui contient une méthode d'instance et une méthode de classe

5voto

Kai Points 4641

B. afficher() 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.

2voto

Praveen Kumar Points 192

Les méthodes statiques sont héritées en Java mais elles ne participent pas au polymorphisme. Si nous essayons de remplacer les méthodes statiques, elles masqueront simplement les méthodes statiques de la superclasse au lieu de les remplacer.

0voto

shubham Points 1

tous les membres publics et protégés peuvent être hérités de n'importe quelle classe, tandis que les membres par défaut ou ceux du package peuvent également l'être de la classe au sein du même package que celui de la super classe. Cela ne dépend pas du fait qu'il s'agisse d'un membre statique ou non statique. Mais il est également vrai que la fonction membre statique ne prend pas part à la liaison dynamique. Si la signature de cette méthode statique est identique dans les classes parent et enfant, le concept de Shadowing ne vient pas du polymorphisme.

0voto

user4016405 Points 1

La méthode statique est héritée dans la sous-classe mais ce n'est pas du polymorphisme. Lorsque vous écrivez l'implémentation de la méthode statique, la méthode de la classe du parent est masquée et non remplacée. Pensez, si ce n’est pas hérité, comment vous pouvez y accéder sans classname.staticMethodname(); ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X