Vous pourriez vous retrouver en mesure de penser à faire une finale de méthode statique, considérant ce qui suit:
Avoir les classes suivantes:
class A {
static void ts() {
System.out.print("A");
}
}
class B extends A {
static void ts() {
System.out.print("B");
}
}
Maintenant, la façon « correcte » d'appeler ces méthodes serait
A.ts();
B.ts();
qui aurait pour conséquence AB
mais vous pouvez aussi appeler les méthodes sur les instances:
A a = new A();
a.ts();
B b = new B();
b.ts();
qui entraînerait également AB
.
considèrent maintenant comme suit:
A a = new B();
a.ts();
qui imprimerait A
. Cela pourrait vous surprendre puisque vous avez réellement un objet de la classe B
. Mais puisque vous l'appelez à partir d'une référence de type A
, il appellera A.ts()
. Vous pouvez imprimer B
avec le code suivant:
A a = new B();
((B)a).ts();
Dans les deux cas, l'objet que vous avez est en fait de la classe B
. Mais en fonction du pointeur qui pointe vers l'objet, vous appellerez méthode de A
ou de B
.
Maintenant, disons que vous êtes le développeur de la classe A
et que vous voulez autoriser le sous-classement. Mais vous voulez vraiment la méthode ts()
, à chaque appel, même à partir d'une sous-classe, c'est ce que vous voulez faire et ne pas être caché par une version de sous-classe. Ensuite, vous pouvez le faire final
et l'empêcher d'être caché dans la sous-classe. Et vous pouvez être sûr que le code suivant appelle la méthode de votre classe A
:
B b = new B();
b.ts();
Ok, admittetly qui est en quelque sorte construit, mais il pourrait être logique pour certains cas.
Vous ne devez pas appeler des méthodes statiques sur des instances, mais directement sur les classes. Vous n'aurez donc pas ce problème. Aussi IntelliJ IDEA par exemple vous montrera un avertissement, si vous appelez une méthode statique sur une instance et si vous définissez une méthode statique finale.
cela semble bizarre, +1 pour la question, mais jusqu'à présent, aucune des réponses n'est satisfaisante. –
Ce n'est pas écrasé. Il est toujours là à A.ts(). –