138 votes

Comportement de la méthode statique finale

J'ai été jouer avec des modificateurs avec la méthode statique et est venu à travers un comportement bizarre.

Comme nous le savons, les méthodes statiques ne peuvent pas être remplacées, car elles sont associées à une classe plutôt qu'à l'instance.

Donc, si j'ai l'extrait de code ci-dessous, il compile fine

//Snippet 1 - Compiles fine
public class A {
    static void ts() {
    }
}

class B extends A {
    static void ts() {
    }
}

Mais si je comprend finale modificateur méthode statique dans Une classe, puis la compilation échoue ts() dans B ne peut pas remplacer ts (); méthode de remplacement est statique de la finale.

Pourquoi est-ce qui se passe lorsque la méthode statique ne peut pas être substituée à tous?

178voto

NawaMan Points 10266

Les méthodes statiques ne peuvent pas être remplacés, mais ils peuvent être cachés. L' ts() méthode de B n'est pas remplacé (non soumis à la polymorphisme) en ts() d'Un, mais il va se cacher. Si vous appelez ts() dans B (PAS A.ts() ou B.ts() ... juste ts()), celui de B sera appelée, et pas A. Puisque ce n'est pas l'objet de polymorphisme, l'appel ts() dans Une volonté de ne jamais être redirigé vers celui de B.

Le mot-clé final de désactiver la méthode d'être caché. Ils ne peuvent donc pas être cachés et de tenter de le faire se traduira par une erreur du compilateur.

Espérons que cette aide.

15voto

Vincent Ramdhanie Points 46265
<blockquote> <p>méthodes statiques ne peuvent pas être surchargée</p> </blockquote> <p>C’est pas exactement vrai. L’exemple de code signifie en réalité que le ts méthode b se cache le ts de la méthode a. Si ses pas exactement la substitution. Plus sur <a href="http://faq.javaranch.com/view?OverridingVsHiding">Javaranch</a> , il y a une bonne explication.</p>

11voto

Powerlord Points 43989

Méthodes statiques appartiennent à la classe, et non l'instance.

A.ts() et B.ts() sont toujours des méthodes distinctes.

Le vrai problème, c'est que Java vous permet d'appeler des méthodes statiques sur une instance d'objet. Méthodes statiques avec la même signature de la classe parent sont cachés lorsqu'il est appelé à partir d'une instance de la sous-classe. Cependant, vous ne pouvez pas remplacer/masquer la finale méthodes.

On pourrait penser que le message d'erreur serait d'utiliser le mot caché au lieu de substituée...

0voto

BalusC Points 498232

Je pense que l’erreur de compilation est assez trompeuse ici. Il n’aurait pas dû dire « méthode substituée est statique final. », mais il aurait plutôt dû dire « méthode substituée est final. ». Le modificateur static n’est pas pertinent ici.

0voto

amischiefr Points 1799

La méthode ts() dans B n'est pas de la substitution de la méthode ts() dans A, il est tout simplement une autre méthode. La classe B ne voit pas la méthode de ts() a, puisqu’il est statique, c’est pourquoi il peut déclarer sa propre méthode appelée ts().

Toutefois, si la méthode est définitive, alors le compilateur reprendra qu’il y a une méthode ts() en A qui ne doit pas être substituée dans B.

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