Какое ключевое слово в Java запрещает наследование от класса?

«Какое ключевое слово в Java запрещает наследование от класса?» — вопрос из категории Основы программирования, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Ключевое слово final, применённое к объявлению класса, запрещает создание от него подклассов (наследование).

Пример:

// Класс, объявленный как final, не может быть унаследован
final class ImmutableApiConfig {
    private final String baseUrl;

    public ImmutableApiConfig(String url) {
        this.baseUrl = url;
    }

    public String getBaseUrl() {
        return baseUrl;
    }
}

// Попытка наследования вызовет ошибку компиляции:
// error: cannot inherit from final ImmutableApiConfig
class ExtendedConfig extends ImmutableApiConfig { 
    // Этот код не скомпилируется
}

Зачем это нужно?

  • Обеспечение неизменяемости (immutability): Часто используется для классов, которые должны гарантировать, что их поведение не будет изменено через наследование (например, String).
  • Безопасность и проектирование: Предотвращает непреднамеренное или злонамеренное изменение критичной логики класса-предка.
  • Оптимизация: Компилятор может применить дополнительные оптимизации, зная, что у класса не может быть подклассов.

Примечание: Ключевое слово final также может применяться к методам (запрещает переопределение в подклассах) и переменным (делает ссылку или примитив неизменяемыми).