Une méthode spécifiée final est finale, c'est-à-dire qu'elle ne peut pas être redéfinie (ou, si elle est statique, elle ne peut pas être masquée) dans une classe dérivée :
class A { final void f() { ... } } class B extends A { void f() { ... } // INTERDIT }
Une classe spécifiée final est finale, c'est-à-dire qu'aucune classe ne peut en être dérivée :
final class A { ... } class B extends A { ... } // INTERDIT
Méthodes et classes finales sont utilisées dans un but de sécurité (un utilisateur de la classe ne peut pas modifier son comportement) et dans un but d'optimisation, puisque la détermination de la méthode invoquée peut être faite dès la compilation, sans que le mécanisme de liaison tardive se produise.
Enfin, un champ peut être déclaré final afin d'interdire toute
modification de sa valeur après initialisation :
final double n = 3; n = 4; // INTERDIT
Une constante de classe est déclarée comme un champ static final :
static final double PI = 3.14;
Par exemple, l'expression System.out.println("Hello") est l'invocation de la méthode println() de la constante (membre statique final) out (de type PrintStream) de la classe System. Les constantes sont souvent désignées par un nom en lettres majuscules (comme PI) :
static final int EST = 0; static final int NORD = 1; static final int OUEST = 2; static final int SUD = 3;
Ces constantes d'énumération sont particulièrement utiles dans une instruction d'aiguillage (switch).