Static Blocks in Java
In simpler language whenever we use a static keyword and associate it to a block then that block is referred to as a static block. Unlike C++, Java supports a special block, called a static block (also called static clause) that can be used for static initialization of a class. This code inside the static block is executed only once: the first time the class is loaded into memory.
Calling of static block in java?
Now comes the point of how to call this static block. So in order to call any static block, there is no specified way as static block executes automatically when the class is loaded in memory. Refer to the below illustration for understanding how static block is called.
Illustration:
class GFG < // Constructor of this class GFG() <>// Method of this class public static void print() < >static<> public static void main(String[] args) < // Calling of method inside main() GFG geeks = new GFG(); // Calling of constructor inside main() new GFG(); // Calling of static block // Nothing to do here as it is called // automatically as class is loaded in memory >>
Note: From the above illustration we can perceive that static blocks are automatically called as soon as class is loaded in memory and there is nothing to do as we have to in case of calling methods and constructors inside main().
Can we print something on the console without creating main() method?
It is very important question from the interview’s perceptive point. The answer is yes we can print if we are using JDK version 1.6 or previous and if after that it will throw an. error.
Example 1-A: Running on JDK version 1.6 of Previous
Initializing Fields
As you have seen, you can often provide an initial value for a field in its declaration:
public class BedAndBreakfast < // initialize to 10 public static int capacity = 10; // initialize to false private boolean full = false; >
This works well when the initialization value is available and the initialization can be put on one line. However, this form of initialization has limitations because of its simplicity. If initialization requires some logic (for example, error handling or a for loop to fill a complex array), simple assignment is inadequate. Instance variables can be initialized in constructors, where error handling or other logic can be used. To provide the same capability for class variables, the Java programming language includes static initialization blocks.
Note: It is not necessary to declare fields at the beginning of the class definition, although this is the most common practice. It is only necessary that they be declared and initialized before they are used.
Static Initialization Blocks
A static initialization block is a normal block of code enclosed in braces, < >, and preceded by the static keyword. Here is an example:
A class can have any number of static initialization blocks, and they can appear anywhere in the class body. The runtime system guarantees that static initialization blocks are called in the order that they appear in the source code.
There is an alternative to static blocks you can write a private static method:
The advantage of private static methods is that they can be reused later if you need to reinitialize the class variable.
Initializing Instance Members
Normally, you would put code to initialize an instance variable in a constructor. There are two alternatives to using a constructor to initialize instance variables: initializer blocks and final methods.
Initializer blocks for instance variables look just like static initializer blocks, but without the static keyword:
The Java compiler copies initializer blocks into every constructor. Therefore, this approach can be used to share a block of code between multiple constructors.
A final method cannot be overridden in a subclass. This is discussed in the lesson on interfaces and inheritance. Here is an example of using a final method for initializing an instance variable:
This is especially useful if subclasses might want to reuse the initialization method. The method is final because calling non-final methods during instance initialization can cause problems.
Previous page: Understanding Class Members
Next page: Summary of Creating and Using Classes and Objects
Кофе-брейк #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. Мы также увидели, как создавать статические переменные и методы на примерах. Наконец, мы поговорили о статических блоках, которые можно использовать для инициализации статических переменных. Статические блоки выполняются перед основным методом. Удачного кодирования!