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 ABmais 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 Bavec 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 Aou from B.
Disons maintenant que vous êtes le développeur de la classe Aet 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 finalet 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.