Работа со статическими переменными java

Кофе-брейк #142. Какую роль в Java играет ключевое слово static?

Java-университет

Кофе-брейк #142. Какую роль в Java играет ключевое слово static? - 1

Источник: FreeCodeCamp Ключевое слово static можно использовать в разных частях кода Java, таких как переменные, методы и статические блоки. Сегодня мы узнаем, как именно его можно применять на практике. Основная цель использования ключевого слова static в Java — экономия памяти. Когда мы создаем переменную в классе, к которой будут обращаться другие классы, мы должны сначала создать экземпляр класса, а затем присвоить новое значение каждому экземпляру переменной. Это нужно, чтобы значения новых переменных были одинаковы для всех новых классов/объектов. Но когда мы создаем статические переменные, их значение остается постоянным во всех других классах, и нам не нужно создавать экземпляр для использования переменной. Таким образом, мы создаем переменную один раз, поэтому память выделяется только один раз. Вы лучше поймете это на нескольких примерах в этой статье.

Как создать статическую переменную в Java

Чтобы понять, как использовать ключевое слово static при создании переменных, давайте рассмотрим обычный способ создания переменных, общих для каждого экземпляра класса.

Объясняю, что произошло в приведенном выше коде шаг за шагом. Мы создали класс Student с тремя переменными — studentName , course и school . Затем мы создали два экземпляра класса Student :

 Student Student1 = new Student(); Student Student2 = new Student(); 

Первый экземпляр — Student1 , который имеет доступ к переменным, созданным в его классе, обладает следующими значениями:

 Student1.studentName = "Ihechikara"; Student1.course = "Data Visualization"; Student1.school = "freeCodeCamp"; 
 Student2.studentName = "John"; Student2.course = "Data Analysis with Python"; Student2.school = "freeCodeCamp"; 

Если присмотреться, то можно обнаружить, что у обоих учеников одно и то же название школы — “freeCodeCamp”. Но что, если бы нам пришлось создать 100 учеников для одной и той же школы? Это означает, что мы будем инициализировать переменную с одним и тем же значением 100 раз, каждый раз выделяя новую память. Может для кого-то это и не проблема, но в крупной кодовой базе это может значительно замедлить работу программы. Чтобы решить этот вопрос, мы будем использовать ключевое слово static для создания переменной school . После этого все экземпляры класса могут использовать эту переменную. Примерно вот так:

Читайте также:  Удар питона от ганвеста

В этом коде мы создали статическую переменную с именем school . Заметьте, что ключевое слово static предшествовало типу данных и имени переменной: static String school = «freeCodeCamp»; . Теперь, когда мы создаем новый экземпляр нашего класса, нам не нужно инициализировать переменную school для каждого экземпляра. В нашем коде мы присвоили значение переменной только в первом экземпляре, а затем оно было унаследовано следующим экземпляром. Обратите внимание, что изменение значения статической переменной в любом месте кода переопределяет значение в других частях кода, где оно было объявлено ранее. Таким образом, вы должны использовать ключевое слово static только для переменных, которые должны оставаться постоянными в программе. Вы также можете присвоить значение переменной при ее создании, чтобы вам не нужно было объявлять ее снова при создании экземпляра класса: static String school = «freeCodeCamp»; . Вот что вы получите, если будете этот использовать метод:

Как создать статический метод в Java

  • Статические методы могут получать доступ и изменять только статические переменные.
  • Статические методы можно вызывать/использовать без создания экземпляра класса.
 class EvenNumber < static int evenNumber; static void incrementBy2()< evenNumber = evenNumber + 2; System.out.println(evenNumber); >public static void main(String[] args) < incrementBy2(); // 2 incrementBy2(); // 4 incrementBy2(); // 6 incrementBy2(); // 8 >> 

В приведенном выше коде мы создали целое число ( evenNumber ) в классе с именем EvenNumber . Наш статический метод называется incrementBy2() . Этот метод увеличивает значение целого числа evenNumber и печатает его значение. Без создания экземпляра класса мы смогли вызвать метод incrementBy2() в методе программы main . Каждый раз, когда мы вызывали метод, значение evenNumber увеличивалось на 2 и выводилось на печать. Также можно присоединить имя класса к методу, используя запись через точку при вызове метода: EvenNumber.incrementBy2(); . Каждый статический метод принадлежит классу, а не экземплярам класса.

Как создать статический блок в Java

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

 class Block < static int year; static < year = 2022; System.out.println("This code block got executed first"); >public static void main(String[] args) < System.out.println("Hello World"); System.out.println(year); >> 

В коде выше мы создали статическую целочисленную переменную year . Затем мы инициализировали ее в статическом блоке:

Как вы видите, статический блок можно создать, используя ключевое слово static, за которым следуют фигурные скобки. В статическом блоке нашего кода мы инициализировали переменную year со значением 2022. Мы также распечатали некоторый текст — “This code block got executed first”. В методе main мы напечатали “Hello World” и статическую переменную year . В консоли код будет выполняться в таком порядке:

Заключение

В этой статье мы говорили о ключевом слове static в Java. Это ключевое слово, которое в основном помогает нам оптимизировать память в программах, написанных на Java. Мы также увидели, как создавать статические переменные и методы на примерах. Наконец, мы поговорили о статических блоках, которые можно использовать для инициализации статических переменных. Статические блоки выполняются перед основным методом. Удачного кодирования!

Источник

Работа со статическими переменными java

В этом примере невозможно инициализировать объект List всеми начальными значениями вместе с объявлением, поэтому используется статический блок.

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

 public class Test < static < System.out.println("Вызов статического блока"); >Test() < System.out.println("Вызов конструктора"); >> class Main < public static void main(String[] args) < Test t1 = new Test(); Test t2 = new Test(); >> 

  • Если для инициализации статических переменных требуется дополнительная логика, за исключением операции присваивания
  • Если инициализация статических переменных подвержена ошибкам и требует обработки исключений
  • У класса может быть несколько статических блоков
  • Статические поля и статические блоки выполняются в том же порядке, в котором они присутствуют в классе
  • Из статического блока нельзя получить доступ к не статическим членам класса
  • Статический блок не может пробросить дальше перехваченные исключения, но может их выбросить. При этом всегда будет выкидываться только java.lang.ExceptionInInitializerError
  • Статические поля или переменные инициализируются после загрузки класса в память в том же порядке, в каком они описаны в классе

Язык программирования Java позволяет создавать классы внутри другого класса. Такой класс называется вложенным (nested). Вложенный класс группирует элементы, которые будут использоваться в одном месте, сделав тем сам код более организованным и читабельным.

  • вложенные классы, объявленные статическими, называются статическими вложенными классами (static nested classes)
  • вложенные классы, объявленные без static, называются внутренними классами (inner classes)

Основное различие между этими понятиями состоит в том, что внутренние классы имеют доступ ко всем членам включающего их класса (включая приватные) верхнего уровня, тогда как статические вложенные классы имеют доступ только к статическим членам внешнего класса.

Наиболее широко используемый подход для создания объектов «одиночка» (singleton) — это статический вложенный класс, поскольку он не требует никакой синхронизации, его легко изучить и реализовать:

 public class Singleton < private Singleton() <>private static class SingletonHolder < private static final Singleton INSTANCE = new Singleton(); >public static Singleton getInstance() < return SingletonHolder.instance; >> 
  • Если какой-то класс используются только в одном другом классе, то их можно сгруппировать, поместив в один общий класс. Это усиливает инкапсуляцию
  • Если вложенный класс не требует какого-либо доступа к членам экземпляра его класса, то лучше объявить его как статический, потому, что таким образом он не будет связан с внешним классом и, следовательно, будет более оптимальным, поскольку ему не потребуется память в куче или в стеке
  • Статические вложенные классы не имеют доступа к какому-либо члену экземпляра внешнего класса — он может получить к ним доступ только через ссылку на объект
  • Статические вложенные классы могут получить доступ ко всем статическим членам внешнего класса, включая приватные
  • Спецификация Java не позволяет объявлять класс верхнего уровня статическим. Только классы внутри других классов могут быть статическими
  • Опять же, этот класс привязан к внешнему классу и если внешний наследуется другим классом, то этот не будет унаследован. При этом данный класс можно наследовать, как и он может наследоваться от любого другого класса и имплементировать интерфейс
  • По сути статический вложенный класс ничем не отличается от любого другого внутреннего класса за исключением того, что его объект не содержит ссылку на создавший его объект внешнего класса
  • Для использования статических методов/переменных/классов нам не нужно создавать объект данного класса
  • Яркий пример вложенного статического класса — HashMap.Entry, который предоставляет структуру данных внутри HashMap. Стоит заметить, также как и любой другой внутренний класс, вложенные классы находятся в отдельном файле .class. Таким образом, если вы объявили пять вложенных классов в вашем главном классе, у вас будет 6 файлов с расширением .class

Говоря о ключевом слове static, нельзя не упомянуть о его применении в определении констант — переменных, которые никогда не изменяются.

В языке Java существует зарезервированное слово «const», но оно не используется, и Java не поддерживает константы на уровне языка. Выход из ситуации имеется: для определения константы необходимо добавить модификаторы «static final» к полю класса.

Константы — это статические финальные поля, содержимое которых неизменно. Это относится к примитивам, String, неизменяемым типам и неизменяемым коллекциям неизменяемых типов. Если состояние объекта может измениться, он не является константой.

Модификатор static делает переменную доступной без создания экземпляра класса, а final делает ее неизменяемой. При этом нужно помнить, что если мы сделаем переменную только static, то ее легко можно будет изменить, обратившись к ней через имя класса. Если переменная будет иметь только модификатор final, то при создании каждого экземпляра класса она может быть проинициализирована своим значением. Соответственно, используя совместно модификаторы static и final, переменная остается статической и может быть проинициализирована только один раз. В Java константой считается не та переменная, которую нельзя изменить в рамках одного объекта, а та, которую не могут изменить ни один экземпляр класса в котором она находится (такая переменная создается и инициализируется один раз для всех экземпляров, сколько бы их не было).

Источник

Оцените статью