В Java, когда объявлено ключевое слово final при декларации переменной примитивного типа (int, float и так далее), значение этой переменной не может быть изменено.

Например, обратите внимание на код в следующей программе:

public class Test {
    public static void main(String args[]) {
        final int i = 10;
        i = 30; // Ошибка, потому что final
    }
}

Когда используется ключевое слово final для не примитивных типов (Помните что не примитивные перменные всегда ссылаются на объекты в Java), поля этих объектов могут быть изменены. final для не примитивных типов означает что именно эта переменная не может быть изменена, а вот поля этой переменной могут быть изменены.

Пример в следующей программе:

class Test1 {
   int i = 10;
}

public class Test2 {
    public static void main(String args[]) {
      final Test1 t1 = new Test1();
      t1.i = 30;  // Works
    }
}

Эта статья является переводом этой статьи.