Для чего используется ключевое слово `static` в Java?

«Для чего используется ключевое слово `static` в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Ключевое слово static обозначает, что член класса (поле, метод, блок или вложенный класс) принадлежит самому классу, а не его экземплярам. Он загружается в память при инициализации класса.

Основные области применения:

1. Статические поля (переменные класса) Общая память для всех экземпляров. Часто используются для констант, счётчиков или общего состояния.

class Employee {
    private static int employeeCount = 0; // Счётчик всех созданных сотрудников
    private String name;
    public Employee(String name) {
        this.name = name;
        employeeCount++; // Изменяется общее для класса поле
    }
    public static int getEmployeeCount() {
        return employeeCount;
    }
}

2. Статические методы Могут быть вызваны без создания экземпляра класса. Не имеют доступа к нестатическим полям и методам.

class MathUtils {
    public static double calculateCircleArea(double radius) {
        return Math.PI * radius * radius;
    }
}
// Вызов:
double area = MathUtils.calculateCircleArea(5.0);

3. Статические блоки инициализации Выполняются один раз при загрузке класса. Используются для сложной инициализации статических полей.

class Config {
    static Properties props;
    static {
        props = new Properties();
        try {
            props.load(new FileInputStream("config.properties"));
        } catch (IOException e) {
            // Обработка ошибки
        }
    }
}

4. Статические вложенные классы Не требуют экземпляра внешнего класса для создания. Часто используются для логической группировки.

class Outer {
    static class Nested { // Может быть создан как new Outer.Nested()
        // Не имеет неявной ссылки на экземпляр Outer
    }
}

Важно: Злоупотребление static нарушает принципы ООП, так как создаёт глобальное состояние, усложняет тестирование и может привести к проблемам в многопоточных сценариях.