Ответ
Статические члены (поля, методы, блоки) принадлежат самому классу, а не его экземплярам. Существуют в единственном экземпляре и загружаются при инициализации класса.
Нестатические члены принадлежат конкретному объекту (экземпляру) и создаются при каждом вызове new.
| Сравнительная таблица: | Критерий | Статический член | Нестатический член |
|---|---|---|---|
| Принадлежность | Классу | Объекту (экземпляру) | |
| Количество в памяти | Один на класс | Один на каждый объект | |
| Доступ через | ИмяКласса.член |
ссылкаНаОбъект.член |
|
| Доступ к контексту | Нет доступа к this, только к другим статическим членам |
Есть доступ к this и ко всем членам (и статическим, и нестатическим) |
|
| Время жизни | От загрузки класса до выгрузки JVM | От создания до удаления объекта GC |
Пример:
class Counter {
// Статическое поле - общий счетчик для всех экземпляров
static int totalCount = 0;
// Нестатическое поле - уникально для каждого экземпляра
int instanceId;
public Counter(int id) {
this.instanceId = id;
totalCount++; // Изменяем общее для всех значение
}
// Статический метод - утилита
static void printTotal() {
System.out.println("Total instances: " + totalCount);
// System.out.println(instanceId); // ОШИБКА: нет доступа к нестатическому полю
}
// Нестатический метод
void printInfo() {
System.out.println("ID: " + this.instanceId + ", Total: " + totalCount);
}
}
// Использование:
Counter c1 = new Counter(1); // totalCount = 1
Counter c2 = new Counter(2); // totalCount = 2
c1.printInfo(); // ID: 1, Total: 2
Counter.printTotal(); // Total instances: 2
Когда использовать:
- Статическое: Для констант (
static final), фабричных/утилитарных методов, кэшей/пулов, общих данных. - Нестатическое: Для состояния и поведения, уникального для каждого объекта.