В чём же тогда преимущество final-класса?
Ответ ясен - в скорости. Если компилятор должен предположить, что класс не может порождать другие классы, он может генерировать лучше и быстрее исполняяемый байт-код. Другой причиной является защищенность. Вооружившись определенными навыками, хакеры могли бы пытаться напасть на систему безопасности Java через наследование. Поэтому многие важные предопределенные классы (например, класс String) неизменяемы.