Я не знаю, считается ли это, но в Java вам нужно сделать окончательные локальные переменные, чтобы иметь возможность использовать их во внутренних классах (потому что Java не имеет реальных замыканий, а вместо этого делает копии захваченной области, которая должнавпредь быть неизменным):
void test(){
final long startTime = System.currentTimeMillis(); // needs to be final
new Runnable(){
System.out.println(startTime);
}.run();
}
Кроме того, вы можете сделать поля и переменные окончательными, чтобы защитить себя от случайного переназначения их (и компилятор и среда выполнения также могут использовать эту информацию для оптимизации производительности).
Конечно, оба эти примера на самом деле не относятся к константам в математическом смысле (конечные переменные в Java могут быть назначены вычисляемым выражениям в зависимости от ввода переменных).