В Java существует специальное ключевое слово final, у которого сразу несколько предназначений:
finalна уровне класса (например,public final class String) означает, что автор класса решил, что вы не можете наследоваться от этого класса.finalна уровне метода (например,public final native Class<?> getClass()) означает, что автор класса решил, что вы не можете переопределить этот метод при наследовании.finalна уровне полей и переменных* означает возможность инициализировать что-то (присвоить) всего один раз.
Примечание*: на самом деле final можно писать и перед параметром метода (в объявлении), но это достаточно редкая практика.
Мы не рекомендуем вам использовать 1-2 варианты и рассмотрим более подробно третий вариант.
Рассмотрим эталонный пример - класс Math:
public final class Math {
public static final double E = 2.7182818284590452354;
public static final double PI = 3.14159265358979323846;
...
}В данном случае final говорит, что поля могут быть инициализированы только один раз: т.е. только один раз к имени PI будет привязано значение.
А поскольку значение - примитив, то и поменять мы его не сможем.
Достаточно часто final используют для зависимостей, инициализируемых либо через инициализаторы полей, либо через конструкторы:
Используется это чаще всего для того, чтобы вы "случайно" не перезаписали это поле.
В случае с final переменными ситуация та же, что и с полями - используют это для того, чтобы "случайно" не перетереть значение переменной.
Использовать эту практику или нет, целиком зависит от стиля кодирования, который будет принят в вашей команде.

