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

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

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

class Student {
    String studentName; 
    String course; 
    String school;
        
    public static void main(String[] args) {
        Student Student1 = new Student();
        Student Student2 = new Student();
        
        Student1.studentName = "Ihechikara";
        Student1.course = "Data Visualization";
        Student1.school = "freeCodeCamp";
        
        Student2.studentName = "John";
        Student2.course = "Data Analysis with Python";
        Student2.school = "freeCodeCamp";
        
        System.out.println(Student1.studentName + " " + Student1.course + " " + Student1.school + "\n");
        // Ihechikara Data Visualization freeCodeCamp
        System.out.println(Student2.studentName + " " + Student2.course + " " + Student2.school);
        // John Data Analysis with Python freeCodeCamp
    }
}
Объясняю, что произошло в приведенном выше коде шаг за шагом. Мы создали класс 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. После этого все экземпляры класса могут использовать эту переменную. Примерно вот так:

class Student {
    String studentName; 
    String course; 
    static String school;
        
    public static void main(String[] args) {
        Student Student1 = new Student();
        Student Student2 = new Student();
        
        
        Student1.studentName = "Ihechikara";
        Student1.course = "Data Visualization";
        Student1.school = "freeCodeCamp";
        
        
        Student2.studentName = "John";
        Student2.course = "Data Analysis with Python";
        
        System.out.println(Student1.studentName + " " + Student1.course + " " + Student1.school + "\n");
        // Ihechikara Data Visualization freeCodeCamp
        System.out.println(Student2.studentName + " " + Student2.course + " " + Student2.school);
        // John Data Analysis with Python freeCodeCamp
    }
}
В этом коде мы создали статическую переменную с именем school. Заметьте, что ключевое слово static предшествовало типу данных и имени переменной: static String school = "freeCodeCamp";. Теперь, когда мы создаем новый экземпляр нашего класса, нам не нужно инициализировать переменную school для каждого экземпляра. В нашем коде мы присвоили значение переменной только в первом экземпляре, а затем оно было унаследовано следующим экземпляром. Обратите внимание, что изменение значения статической переменной в любом месте кода переопределяет значение в других частях кода, где оно было объявлено ранее. Таким образом, вы должны использовать ключевое слово static только для переменных, которые должны оставаться постоянными в программе. Вы также можете присвоить значение переменной при ее создании, чтобы вам не нужно было объявлять ее снова при создании экземпляра класса: static String school = "freeCodeCamp";. Вот что вы получите, если будете этот использовать метод:

class Student {
    String studentName; 
    String course; 
    static String school = "freeCodeCamp";
        
    public static void main(String[] args) {
        Student Student1 = new Student();
        Student Student2 = new Student();
        
        
        Student1.studentName = "Ihechikara";
        Student1.course = "Data Visualization";
        
        Student2.studentName = "John";
        Student2.course = "Data Analysis with Python";
        
        System.out.println(Student1.studentName + " " + Student1.course + " " + Student1.school + "\n");
        // Ihechikara Data Visualization freeCodeCamp
        System.out.println(Student2.studentName + " " + Student2.course + " " + Student2.school);
        // John Data Analysis with Python freeCodeCamp
    }
}
А сейчас вы увидите, как инициализировать статические переменные с помощью статических блоков.

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

Прежде чем мы рассмотрим пример, вот некоторые вещи, которые нужно знать о статических методах в 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;
        System.out.println("This code block got executed first");
    }
Как вы видите, статический блок можно создать, используя ключевое слово static, за которым следуют фигурные скобки. В статическом блоке нашего кода мы инициализировали переменную year со значением 2022. Мы также распечатали некоторый текст — “This code block got executed first”. В методе main мы напечатали “Hello World” и статическую переменную year. В консоли код будет выполняться в таком порядке:
This code block got executed first Hello World 2022
Это наглядно демонстрирует, как код в статическом блоке выполняется первым перед методом main.

Заключение

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