Независимость экземпляра

Когда переменная или метод являются статическими, это означает, что они не привязаны к конкретному экземпляру или объекту, а скорее будут общими для нескольких экземпляров. Объекту не нужно создавать экземпляр, чтобы использовать функцию, если функция статическая.

Сила:

  • Идеально подходит для утилиты или вспомогательного метода, используемого многими классами, нам не нужно создавать экземпляр каждый раз, когда нам нужно их использовать. Пример: служебный класс Java Math. Буквально все методы и поля здесь статические.

Недостатки:

  • Статические переменные не могут быть очищены сборщиком мусора. Или, если быть точным: статические переменные собираются мусором только тогда, когда загрузчик класса, который загрузил класс, в котором есть статическое поле, собирает мусор. Таким образом, это может вызвать переполнение памяти, если мы используем слишком много статических ключевых слов в переменных [1].
  • Мы не можем переопределить статический метод или сделать абстрактный метод статическим. Поскольку переопределение методов основано на динамическом связывании во время выполнения, а статические методы связываются с помощью статического связывания во время компиляции (поскольку очевидно, что статические X динамические) [2]. По той же причине при тестировании нельзя имитировать статическую функцию.

Где использовать статику

Поля

Пример ниже взят из служебного класса Java TimeZone.

getDisplayName принимает параметр boolean, если сейчас дневной свет или нет, и int, если мы хотим отображать имя в длинной или короткой версии. Вместо того, чтобы заставлять разработчика вводить магическое число 1 / 0, класс TimeZone предоставил постоянное поле, чтобы указать, будет ли отображаемое имя коротким или длинным.

Методы

Пример статического метода — Math.floor.

Вычисление минимального значения числа с плавающей запятой/двойного числа не зависит ни от какого состояния экземпляра. Следовательно, этот метод построен статически. Помните, что при вызове статического метода нам не нужно сначала инициализировать объект.

Блоки

Блоки можно использовать, когда статическое поле требует предварительного расчета перед использованием или когда мы хотим загрузить часть кода без необходимости создания основного метода.

Вложенный класс

Мы можем создать статический класс, но только для внутреннего класса. Это используется, когда мы хотим, чтобы внутренний класс был доступен без необходимости его инициализации.

Ссылка на «статический» в «нестатический»

Если мы не понимаем различий между статическими и нестатическими ссылками, мы можем столкнуться со следующей ошибкой:

Без объекта нет данных экземпляра для str. Чтобы печатать с помощью getStr(), нам нужно сначала узнать заданное значение str. Так что если что-то не статично, то нам нужен экземпляр для работы с этим. Будьте осторожны, чтобы не перепутать их!