Vous pourriez vous trouver en position de penser à rendre une méthode statique définitive, compte tenu des éléments suivants:
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 manière `` correcte '' d'appeler ces méthodes serait
A.ts();
B.ts();
ce qui entraînerait AB
mais vous pourriez également appeler les méthodes sur les instances:
A a = new A();
a.ts();
B b = new B();
b.ts();
ce qui en résulterait AB
également.
Considérez maintenant ce qui suit:
A a = new B();
a.ts();
cela imprimerait A
. Cela pourrait vous surprendre puisque vous avez en fait un objet de 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 selon le pointeur qui pointe vers l'objet, vous appellerez la méthode from A
ou from B
.
Disons maintenant que vous êtes le développeur de la classe A
et que vous souhaitez autoriser le sous-classement. Mais vous voulez vraiment que la méthode ts()
, chaque fois qu'elle est appelée, même à partir d'une sous-classe, fasse ce que vous voulez qu'elle fasse et ne soit pas masquée par une version de sous-classe. Ensuite, vous pouvez le créer final
et l'empêcher d'être caché dans la sous-classe. Et vous pouvez être sûr que le code suivant appellera la méthode à partir de votre classe A
:
B b = new B();
b.ts();
Ok, admettre que c'est en quelque sorte construit, mais cela peut avoir du sens dans certains cas.
Vous ne devez pas appeler de méthodes statiques sur les instances mais directement sur les classes - alors vous n'aurez pas ce problème. IntelliJ IDEA, par exemple, vous montrera également un avertissement, si vous appelez une méthode statique sur une instance et aussi si vous rendez une méthode statique définitive.