Короткий ответ
Статические члены принадлежат классу, а не отдельному экземпляру: static-поле хранится в единственном экземпляре и разделяется всеми объектами класса, а static-метод вызывается через имя класса, без создания объекта. Назначение — общие данные (счётчик созданных объектов, конфигурация) и вспомогательные операции, которым состояние не нужно: Math.max(), Integer.parseInt().
Как это работает подробнее
Статическое поле инициализируется один раз при загрузке класса, и из любого объекта через него видно одно и то же значение. Статический метод не привязан к объекту, поэтому внутри него нельзя напрямую обращаться к нестатическим полям и методам экземпляра — у метода просто нет ссылки this. Перегружать статические методы можно, переопределять — нельзя.
- Статическое поле — общее состояние для всех экземпляров: счётчик созданных объектов, разделяемая конфигурация, кэш.
- Статический метод — операция без состояния объекта: математические вычисления, парсинг, фабричные и служебные методы.
- Сокрытие (hiding) — одноимённый статический метод в наследнике не переопределяет родительский, а скрывает его; выбор метода зависит от типа ссылки, а не фактического типа объекта.
Пример кода
Counter.java
public class Counter {
static int total; // статическое поле: одно на весь класс
int id; // поле экземпляра
public Counter() {
total++; // общий счётчик созданных объектов
id = total;
}
static int getTotal() { // статический метод: вызов без объекта
return total;
}
public static void main(String[] args) {
Counter a = new Counter();
Counter b = new Counter();
System.out.println(Counter.getTotal()); // 2
}
}Что использовать на практике
- Используй статические методы для операций, которым не нужно состояние объекта: утилиты, парсинг, фабрики.
- Используй статические поля для данных, общих для всех экземпляров или всего приложения, например счётчиков.
- Обращайся к статическим членам через имя класса — это читается яснее, чем вызов через объект.
Подводные камни
- Статические методы нельзя переопределить: одноимённый метод в наследнике лишь скрывает родительский, полиморфного вызова не будет.
- Из статического метода нет доступа к
this, нестатическим полям и методам экземпляра. - Обильное глобальное статическое состояние создаёт скрытые зависимости и усложняет тестирование.
Как отвечать на собеседовании
- Объясни, что статические члены принадлежат классу, а не экземпляру → приведи примеры (счётчик,
Math.max(),Integer.parseInt()) → покажи вызов через имя класса → назови ограничения (нетthis) → добавь, что переопределять их нельзя, а можно только скрывать.