Mise à jour: La réponse originale ci-dessous a été rédigée sans bien comprendre la question, et ne répond donc pas directement à la question. :)Néanmoins, elle doit être informative pour ceux qui cherchent à comprendre l'utilisation générale du finalmot - clé.
Pour ce qui est de la question, je voudrais citer mon propre commentaire ci-dessous.
Je pense que vous n'êtes pas obligé de mettre en œuvre la finalité d'un argument pour vous laisser libre de décider s'il doit être définitif ou non dans votre propre mise en œuvre.
Mais oui, cela semble assez étrange que vous puissiez le déclarer finaldans l'interface, mais que ce soit non final dans l'implémentation. Cela aurait été plus logique si:
une. finalLe mot clé n'était pas autorisé pour les arguments de méthode d'interface (abstraite) (mais vous pouvez l'utiliser dans l'implémentation), ou
b. déclarer un argument comme finaldans interface le forcerait à être déclaré finaldans l'implémentation (mais pas forcé pour les non finales).
Je peux penser à deux raisons pour lesquelles une signature de méthode peut avoir des finalparamètres: Beans et Objects (en fait, ce sont tous les deux la même raison, mais des contextes légèrement différents. )
Objets:
public static void main(String[] args) {
StringBuilder cookingPot = new StringBuilder("Water ");
addVegetables(cookingPot);
addChicken(cookingPot);
System.out.println(cookingPot.toString());
}
private static void addVegetables(StringBuilder cookingPot) {
cookingPot.append("Carrot ");
cookingPot.append("Broccoli ");
cookingPot = new StringBuilder(cookingPot.toString());
cookingPot.append("Cauliflower ");
}
private static void addChicken(final StringBuilder cookingPot) {
cookingPot.append("Chicken ");
cookingPot.append("ChickenBroth ");
}
Le finalmot-clé garantit que nous ne créerons pas accidentellement une nouvelle marmite locale en affichant une erreur de compilation lorsque nous avons tenté de le faire. Cela garantit que le bouillon de poulet est ajouté à notre marmite d'origine que la addChickenméthode a obtenue. Comparez cela à l' addVegetablesendroit où nous avons perdu le chou-fleur parce qu'il l'a ajouté à une nouvelle marmite locale au lieu de la marmite d'origine.
Beans:
C'est le même concept que les objets (comme indiqué ci-dessus) . Les beans sont essentiellement des Objects en Java. Cependant, les beans (JavaBeans) sont utilisés dans diverses applications comme un moyen pratique de stocker et de transmettre une collection définie de données associées. Tout comme le addVegetablespourrait gâcher le processus de cuisson en créant une nouvelle marmite StringBuilderet en le jetant avec le chou-fleur, il pourrait également faire de même avec une marmite JavaBean .
finalne fait rien avec les types natifs de toute façon, puisqu'ils sont copiés.