Модификатор static

Static

К чему относитсяЧто означает
ПолеПеременная статическая, то значение — одно для всех экземпляров класса. Переменная относится к классу, а не к экземпляру класса
Статический метод

Static method
который будет выполнен во время загрузки класса — для инициализации статичных полей

Exception Initializer Error — исключение возникшее во время выполнения и инициализации статических полей

Методы-фабрики и методы-утилиты хорошие образцы применения модификатора static
Вложенный статический класс

Nested static class
Пример — HashMap.Entry, который предоставляет структуру данных внутри HashMap

Ещё одним примером использования является объявление собственного компаратора (Comparator), например компаратор по возрасту (AgeComparator) в классе сотрудники (Employee).

Вложенный класс, объявленный с модификатором static, теряет возможность обращаться к нестатическим членам внешнего класса.
Статический блок инициализации

Static initializer block
static importНаиболее часто данная конструкция встречается в тестах JUnit, т.к. почти все разработчики тестов используют static import для assert методов, например assertEquals() и для их перегруженных дубликатов
https://javarush.ru/groups/posts/modifikator-static-java

Статическое поле (Static field)

package com.bouncer77.io;

public class Car {
    public static int km = 10;

    public static void main(String[] args) {
        Car ford = new Car();

        System.out.println(ford.km); // 10
        System.out.println(Car.km); // 10 - рекомендуемый способ обращения к статическим переменным
    }
}

Статический блок инициализации (Static initializer block)

Блок предназначен для инициализации внутренних переменных. Если блок обычный, то им инициализируют внутренние переменные объекта, если же статический, соответственно, им задают статические переменные (то есть переменные класса).

статическое поле будет проинициализировано ещё ДО того как кто-нибудь об этом «попросит» — не «ленивая» инициализация

public class Car {
  static int km;

  static {
     km = 150;
  }
}

Статический метод (Static method)

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

Полезно знать, что статические методы связываются во время компиляции, в отличие от связывания виртуальных или не статических методов, которые связываются во время исполнения на реальном объекте. Следовательно, статические методы не могут быть переопределены в Java, т.к. полиморфизм во время выполнения не распространяется на них.

Статические метод может обратиться только к статическим переменным/методам.

public class Counter {
  static int count;

  public static void invokeCounter() {
     count++;
     System.out.println("Текущее значение счётчика - " + count);
  }
}

Вложенный статический класс (Nested static class)

Статическим классом может быть только внутренний класс

есть доступ к приватным статическим переменным внешнего класса
public class Vehicle {

  public static class Car {
     public int km;
  }
}

Vehicle.Car car = new Vehicle.Car();
car.km = 90;

Что необходимо знать о модификаторе Static

В отличие от локальных переменных, статические поля и методы НЕ потокобезопасны (Thread-safe) в Java. На практике это одна из наиболее частых причин возникновения проблем связанных с безопасностью мультипоточного программирования.

Поэтому при использовании статических переменных, убедитесь, что они должным образом синхронизированы (synchronized), во избежание проблем, например таких как «состояние гонки» (race condition).

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

Статический метод можно вызвать, используя тип класса, в котором эти методы описаны. Именно поэтому, подобные методы как нельзя лучше подходят в качестве методов-фабрик (factory), и методов-утилит (utility). Класс java.lang.Math — замечательный пример, в котором почти все методы статичны, по этой же причине классы-утилиты в Java финализированы (final).

Другим важным моментом является то, что вы НЕ можете переопределять (Override) статические методы. Если вы объявите такой же метод в классе-наследнике (subclass), т.е. метод с таким же именем и сигнатурой, вы лишь «спрячете» метод суперкласса (superclass) вместо переопределения. Это явление известно как сокрытие методов (hiding methods). Это означает, что при обращении к статическому методу, который объявлен как в родительском, так и в дочернем классе, во время компиляции всегда будет вызван метод исходя из типа переменной. В отличие от переопределения, такие методы не будут выполнены во время работы программы

class Vehicle{
     public static void  kmToMiles(int km){
          System.out.println("Vehicle");
     } }

class Car extends Vehicle{
     public static void  kmToMiles(int km){
          System.out.println("Car");
     } }

public class Demo{
   public static void main(String args[]){
      Vehicle v = new Car();
       v.kmToMiles(10); // Vehicle
  }}

Сериализация

Во время сериализации, также как и transient переменные, статические поля не сериализуются

если сохранить любые данные в статическом поле, то после десериализации новый объект будет содержать его первичное (по-умолчанию) значение.
Оцените автора
Kosenkov.Pro
Добавить комментарий