static ·
‹ Предыдущий Следующий ›
⏱ 5 минут чтения Обновлено: 2026-09-25

Статические методы в Java и ключевое слово static

Попробуйте вызвать обычный метод прямо из main() — например, nonStaticMethod(); — и компилятор остановит вас сообщением non-static method nonStaticMethod() cannot be referenced from a static context. Причина в том, что main() — статический метод, а у статического метода нет объекта, от имени которого можно было бы вызвать метод экземпляра.

Статический метод в Java — это метод, объявленный с ключевым словом static, который принадлежит самому классу, а не его объектам. Его можно вызывать без создания экземпляра класса, через имя класса: ClassName.method(). В этом ключевое отличие статических методов от обычных методов (методов экземпляра), которые всегда вызываются на конкретном объекте.

Как объявить и вызвать статический метод

Чтобы объявить статический метод, достаточно добавить модификатор static перед типом возвращаемого значения. Вызывать такой метод правильно через имя класса; внутри того же класса имя можно опустить.

public class StaticMethodClass {
    static int staticVar = 3;
    int nonStaticVar;

    public void nonStaticMethod() {
        System.out.println("Нестатический метод");
    }

    static void staticMethod(int localVar) {
        System.out.println("localVar = " + localVar);
        System.out.println("staticVar = " + staticVar);
        // Ошибка компиляции: нельзя обратиться к нестатической переменной
        // из статического метода без ссылки на объект
        // System.out.println("nonStaticVar = " + nonStaticVar);
    }

    public static void main(String[] args) {
        staticMethod(42);                  // внутри класса имя можно опустить
        StaticMethodClass.staticMethod(42); // то же самое, явно через имя класса

        // Ошибка компиляции: non-static method nonStaticMethod()
        // cannot be referenced from a static context
        // nonStaticMethod();

        StaticMethodClass useStatic = new StaticMethodClass();
        useStatic.nonStaticMethod();       // метод экземпляра — через объект
        useStatic.staticMethod(67);        // компилируется, но это плохой стиль
    }
}

Из другого класса статический метод вызывается через имя класса — объект создавать не нужно:

public class StaticMethodExample {
    public static void main(String[] args) {
        StaticMethodClass.staticMethod(42);
    }
}

Стиль кода

Вызов useStatic.staticMethod(67) через ссылку на объект компилируется, но создаёт ложное впечатление, что метод зависит от объекта. IntelliJ IDEA и javac с -Xlint:static выдают на это предупреждение. Всегда вызывайте статические методы через имя класса: StaticMethodClass.staticMethod(67).

Ограничения статических методов

Статический метод выполняется без объекта, поэтому у него нет this. Отсюда следуют правила:

  • Напрямую (без ссылки на объект) статический метод может вызывать только другие статические методы.
  • Напрямую ему доступны только статические переменные класса, а также его параметры и локальные переменные.
  • Внутри статического метода нельзя использовать this и super.
  • К нестатическим полям и методам можно обратиться только через явную ссылку на объект, как useStatic.nonStaticMethod() в примере выше.

Обратное ограничение не действует: метод экземпляра может свободно вызывать статические методы и читать статические поля своего класса.

Статический метод и метод экземпляра: сравнение

Характеристика Статический метод Метод экземпляра
Кому принадлежит Классу Конкретному объекту
Как вызывается ClassName.method() object.method()
Нужен ли объект Нет Да
Доступ к this и super Нет Есть
Доступ к полям Только к статическим (к остальным — через ссылку на объект) К статическим и нестатическим
Наследование Не переопределяется, а скрывается (method hiding) Переопределяется (overriding), работает полиморфизм
Выбор реализации На этапе компиляции, по типу ссылки Во время выполнения, по реальному типу объекта

Когда использовать статические методы

Статический метод уместен, когда результат зависит только от параметров, а не от состояния объекта. Типичные случаи:

  • Утилитные методы — Math.max(a, b), Math.sqrt(x), Arrays.sort(arr), Integer.parseInt("42"), Collections.emptyList().
  • Фабричные методы, которые создают объекты вместо конструктора, — List.of(1, 2, 3), LocalDate.of(2024, 1, 1), String.valueOf(10).
  • Точка входа в программу — метод public static void main(String[] args).
  • Работа со статическими полями — счётчики, кэши, доступ к общим настройкам.

Если метод читает или меняет поля объекта, делайте его обычным методом экземпляра. Злоупотребление static превращает объектно-ориентированный код в процедурный и затрудняет тестирование: статический вызов сложно подменить заглушкой (mock).

Статические методы в record

В record статические методы и статические поля разрешены (в отличие от нестатических полей вне компонентов записи). Чаще всего это фабричные методы:

public record Point(int x, int y) {
    static final Point ORIGIN = new Point(0, 0);

    static Point of(int x, int y) {
        return new Point(x, y);
    }
}

Часто задаваемые вопросы

Можно ли переопределить статический метод в Java?

Нет. Если в подклассе объявить статический метод с той же сигнатурой, он скрывает (hides) метод родителя, а не переопределяет его. Реализация выбирается по типу ссылки на этапе компиляции: для Parent p = new Child(); вызов p.staticMethod() выполнит версию из Parent. Аннотация @Override на статическом методе вызовет ошибку компиляции.

Почему метод main объявлен как static?

JVM запускает программу, когда ни одного объекта класса ещё не существует. Статический main можно вызвать через имя класса без создания экземпляра, поэтому он и служит точкой входа.

Что будет, если вызвать статический метод через ссылку, равную null?

NullPointerException не возникнет. Компилятор подставляет вызов по типу переменной, а не по объекту, поэтому код StaticMethodClass obj = null; obj.staticMethod(1); отработает нормально. Это популярный вопрос на собеседованиях и ещё одна причина вызывать статические методы только через имя класса.

Может ли статический метод быть abstract?

Нет. Абстрактный метод должен быть переопределён в подклассе, а статические методы не переопределяются, поэтому сочетание abstract static даёт ошибку компиляции «illegal combination of modifiers».

Потокобезопасны ли статические методы?

Сам по себе модификатор static потокобезопасности не даёт. Метод, работающий только с параметрами и локальными переменными, безопасен. Если же он изменяет статические поля, общие для всех потоков, нужна синхронизация: например, static synchronized блокирует объект Class этого класса.

Видео объяснение

Предпочитаете видеоформат? Посмотрите этот урок с примерами и объяснениями.

Комментарии

Зарегистрируйтесь или войдите, чтобы иметь возможность оставить комментарий.