- Can we declare a static variable within a method in java?
- Example
- Output
- Static variables in methods
- Example
- Compile time error
- Java static data in method
- Кофе-брейк #142. Какую роль в Java играет ключевое слово static?
- Как создать статическую переменную в Java
- Как создать статический метод в Java
- Как создать статический блок в Java
- Заключение
Can we declare a static variable within a method in java?
A static filed/variable belongs to the class and it will be loaded into the memory along with the class. You can invoke them without creating an object. (using the class name as reference). There is only one copy of the static field available throughout the class i.e. the value of the static field will be same in all objects. You can define a static field using the static keyword.
Example
public class Sample < static int num = 50; public void demo()< System.out.println("Value of num in the demo method "+ Sample.num); >public static void main(String args[]) < System.out.println("Value of num in the main method "+ Sample.num); new Sample().demo(); >>
Output
Value of num in the main method 50 Value of num in the demo method 50
Static variables in methods
The variables with in a method are local variables and their scope lies within the method and they get destroyed after the method execution. i.e. you cannot use a local variable outside the current method which contradicts with the definition of class/static variable. Therefore, declaring a static variable inside a method makes no sense, if you still try to do so, a compile time error will be generated.
Example
In the following Java program, we are trying to declare a static variable inside a method
import java.io.IOException; import java.util.Scanner; public class Sample < static int num; public void sampleMethod(Scanner sc)< static int num = 50; >public static void main(String args[]) throws IOException < static int num = 50; >>
Compile time error
If you try to execute the above program it generates the following error −
Sample.java:6: error: illegal start of expression static int num = 50; ^ Sample.java:9: error: illegal start of expression static int num = 50; ^ 2 errors
Java static data in method
В этом примере невозможно инициализировать объект 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 константой считается не та переменная, которую нельзя изменить в рамках одного объекта, а та, которую не могут изменить ни один экземпляр класса в котором она находится (такая переменная создается и инициализируется один раз для всех экземпляров, сколько бы их не было).
Кофе-брейк #142. Какую роль в Java играет ключевое слово static?
Источник: 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. Мы также увидели, как создавать статические переменные и методы на примерах. Наконец, мы поговорили о статических блоках, которые можно использовать для инициализации статических переменных. Статические блоки выполняются перед основным методом. Удачного кодирования!