Pas exactement pourquoi vous avez demandé lorsque vous possédez déjà la plupart (si pas tous) de la réponse. Mais laissez-moi essayer, si je peut vous amener à comprendre.
Comme vous le mentionnez, final
est utilisé avec une méthode en Java pour marquer que la méthode ne peut pas être remplacé (pour la portée de l'objet) ou caché (statique). Cela permet au développeur d'origine pour créer une fonctionnalité que l'on peut être sûr ne sera pas changé par d'autres, et c'est la garantie qu'il offre.
Cela signifie que si la méthode s'appuie sur d'autres composants personnalisables, comme la non-public des champs/méthodes de la fonctionnalité de la dernière méthode peut encore être personnalisable. C'est bon mais comme (avec le polymorphisme), il permet une personnalisation partielle.
Alors, pourquoi voulez-vous empêcher quelque chose d'être personnalisable, vous pouvez demander.
Il existe un certain nombre de raisons.
Pour permettre l'accès aux données encapsulées -- regarde immuable objet où ses attributs sont définis au moment de la construction et ne doit jamais être modifiée. Ou une valeur calculée dérivés de ces attributs. Un bon exemple est la Java de la classe String.
De la fiabilité et de Contrat, les objets sont composées par des primitives de données ou d'autres moins-objets complexes. Pas toutes les opérations qui sont applicables à ces composants devraient être applicables ou même logique lorsqu'ils sont utilisés dans le plus grand objet. Méthode finale méthodes peuvent être utilisées pour s'assurer que. Compteur de classe est un bon exemple.
public class Counter {
private int counter = 0;
public final int count() {
return counter++;
}
public final int reset() {
return (counter = 0);
}
}
Si le comte méthode n'est pas définitive, nous pouvons faire quelque chose comme ceci:
Counter c = new Counter() {
public int count() {
super.count();
return super.count();
}
}
c.count(); // now count 2
Ou quelque chose comme ceci:
Counter c = new Counter() {
public int count() {
int lastCount = 0;
for (int i = super.count(); --i >= 0; ) {
lastCount = super.count();
}
return lastCount;
}
}
c.count(); // Now double count
- Performance -- Certains compilateurs peuvent analyser et d'optimiser l'opération, surtout sans effets secondaires.
C'est à partir du haut de ma tête.
Espérons que cela aide un peu.