Ответ
Ключевое слово static в Java означает, что член класса (поле, метод, блок, вложенный класс) принадлежит самому классу, а не его экземплярам (объектам).
Основные случаи использования:
-
Статические поля (переменные класса):
- Существует в единственном экземпляре для всего класса.
- Общая память для всех объектов этого класса.
class Counter { static int count = 0; // Общая переменная для всех Counter Counter() { count++; } }
-
Статические методы:
- Вызываются через имя класса:
ClassName.methodName(). - Не могут обращаться к нестатическим (экземплярным) полям и методам напрямую (т.к. нет контекста
this). - Часто используются для утилитарных функций (например,
Math.sqrt()).
- Вызываются через имя класса:
-
Статический блок инициализации:
- Выполняется один раз при загрузке класса в память.
class Database { static Connection conn; static { // Инициализация подключения при загрузке класса conn = DriverManager.getConnection(...); } }
- Выполняется один раз при загрузке класса в память.
Важно: static члены загружаются в память при первом использовании класса и существуют всё время работы приложения.
Ответ 18+ 🔞
Ну, слушай, вот есть у тебя класс, да? Как будто чертёж для создания объектов. Так вот, это слово static — оно, блядь, как клей, который приклеивает кусок этого чертежа не к каждому новому объекту, а прямо к самому чертежу, намертво, нахуй. И этот кусок теперь один на всех, общий.
Где эта хуйня применяется, и главное — зачем:
-
Статические поля, они же переменные класса:
- Это, сука, как общая тумбочка в коммуналке. Одна на всех жильцов (объектов). Положил туда печеньку — её могут сожрать все. Изменил — изменение видят все.
- Существует в единственном, ёбта, экземпляре. Не важно, создал ты 0 объектов или 100500.
class Counter { static int count = 0; // Вот эта штука — одна на всех Counter'ов Counter() { count++; } // Каждый новый объект увеличивает ОБЩУЮ счётку } // Создал три объекта — count стал равен трём. Один счётчик на всех, пиздец.
-
Статические методы:
- Их вызывают не у объекта, а у самого класса, прямо так:
ИмяКласса.метод(). КакMath.sqrt()— ты же не создаёшь объектMath, чтобы посчитать корень? Вот именно. - И вот тут важный момент, блядь: внутри статического метода нельзя просто так взять и обратиться к нестатическому полю или методу. Потому что у тебя нет
this, нет конкретного объекта, с которым работать. Это как пытаться спросить "а где твоя куртка?" у абстрактного понятия "человек", а не у конкретного Василия. - Идеальны для утилиток, хелперов, всяких расчётов, где контекст объекта нахуй не нужен.
- Их вызывают не у объекта, а у самого класса, прямо так:
-
Статический блок инициализации:
- Это, блядь, такая штука, которая выполняется ровно один раз — когда класс грузится в память. Раньше, чем ты успеешь что-то создать или вызвать.
- Часто туда пихают какую-то тяжёлую подготовительную хуйню, которую не хочется делать каждый раз.
class Database { static Connection conn; static { // Это выполнится ОДИН РАЗ, при первом упоминании класса Database // Типа "ой, щас подключение к базе нахуячу, и пусть висит" conn = DriverManager.getConnection(...); } }
И главное, что надо запомнить, ёпта: всё, что static, живёт своей отдельной жизнью. Загрузилось при первом касании к классу и болтается в памяти, пока приложение не кончится. Общее на всех. Как глобальная переменная, только привязанная к классу, а не валяющаяся где попало.