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

Ответ

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

Основные случаи использования:

  1. Статические поля (переменные класса):

    • Существует в единственном экземпляре для всего класса.
    • Общая память для всех объектов этого класса.
      class Counter {
      static int count = 0; // Общая переменная для всех Counter
      Counter() { count++; }
      }
  2. Статические методы:

    • Вызываются через имя класса: ClassName.methodName().
    • Не могут обращаться к нестатическим (экземплярным) полям и методам напрямую (т.к. нет контекста this).
    • Часто используются для утилитарных функций (например, Math.sqrt()).
  3. Статический блок инициализации:

    • Выполняется один раз при загрузке класса в память.
      class Database {
      static Connection conn;
      static {
          // Инициализация подключения при загрузке класса
          conn = DriverManager.getConnection(...);
      }
      }

Важно: static члены загружаются в память при первом использовании класса и существуют всё время работы приложения.

Ответ 18+ 🔞

Ну, слушай, вот есть у тебя класс, да? Как будто чертёж для создания объектов. Так вот, это слово static — оно, блядь, как клей, который приклеивает кусок этого чертежа не к каждому новому объекту, а прямо к самому чертежу, намертво, нахуй. И этот кусок теперь один на всех, общий.

Где эта хуйня применяется, и главное — зачем:

  1. Статические поля, они же переменные класса:

    • Это, сука, как общая тумбочка в коммуналке. Одна на всех жильцов (объектов). Положил туда печеньку — её могут сожрать все. Изменил — изменение видят все.
    • Существует в единственном, ёбта, экземпляре. Не важно, создал ты 0 объектов или 100500.
      class Counter {
      static int count = 0; // Вот эта штука — одна на всех Counter'ов
      Counter() { count++; } // Каждый новый объект увеличивает ОБЩУЮ счётку
      }
      // Создал три объекта — count стал равен трём. Один счётчик на всех, пиздец.
  2. Статические методы:

    • Их вызывают не у объекта, а у самого класса, прямо так: ИмяКласса.метод(). Как Math.sqrt() — ты же не создаёшь объект Math, чтобы посчитать корень? Вот именно.
    • И вот тут важный момент, блядь: внутри статического метода нельзя просто так взять и обратиться к нестатическому полю или методу. Потому что у тебя нет this, нет конкретного объекта, с которым работать. Это как пытаться спросить "а где твоя куртка?" у абстрактного понятия "человек", а не у конкретного Василия.
    • Идеальны для утилиток, хелперов, всяких расчётов, где контекст объекта нахуй не нужен.
  3. Статический блок инициализации:

    • Это, блядь, такая штука, которая выполняется ровно один раз — когда класс грузится в память. Раньше, чем ты успеешь что-то создать или вызвать.
    • Часто туда пихают какую-то тяжёлую подготовительную хуйню, которую не хочется делать каждый раз.
      class Database {
      static Connection conn;
      static {
          // Это выполнится ОДИН РАЗ, при первом упоминании класса Database
          // Типа "ой, щас подключение к базе нахуячу, и пусть висит"
          conn = DriverManager.getConnection(...);
      }
      }

И главное, что надо запомнить, ёпта: всё, что static, живёт своей отдельной жизнью. Загрузилось при первом касании к классу и болтается в памяти, пока приложение не кончится. Общее на всех. Как глобальная переменная, только привязанная к классу, а не валяющаяся где попало.