Статическое ключевое слово в Java

static ключевое слово в Java широко используется в программировании на Java. Ключевое слово static в Java используется для создания переменной уровня класса в Java. Статические переменные и методы являются частью класса, а не экземпляров класса.

static ключевое слово в Java

Java static ключевое слово можно использовать в пяти случаях, как показано на изображении ниже. Мы обсудим четыре из них здесь, пятый был введен в Java 8, и об этом было рассказано в изменениях в интерфейсе Java 8.

  1. Статическая переменная Java

    Мы можем использовать ключевое слово static с переменной уровня класса. Статическая переменная является переменной класса и не принадлежит объекту/экземпляру класса. Поскольку статические переменные разделяются между всеми экземплярами объекта, они не являются потокобезопасными. Обычно статические переменные используются с ключевым словом final для общих ресурсов или констант, которые могут использоваться всеми объектами. Если статическая переменная не является закрытой, мы можем получить к ней доступ с помощью ИмяКласса.ИмяПеременной

    // Пример статической переменной
        private static int count;
        public static String str;
        public static final String DB_USER = "мойпользователь";
    
  2. Статический метод Java

    То же самое, что и статическая переменная, статический метод принадлежит классу, а не экземплярам класса. Статический метод может обращаться только к статическим переменным класса и вызывать только статические методы класса. Обычно статические методы являются вспомогательными методами, которые мы хотим выставить наружу для использования другими классами без необходимости создания экземпляра. Например, класс Collections. Обертки Java и утилитарные классы содержат много статических методов. Основной метод main(), который является точкой входа программы на Java, сам по себе является статическим методом.

        //пример статического метода
        public static void setCount(int count) {
            if(count > 0)
            StaticExample.count = count;
        }
        
        //статический утилитарный метод
        public static int addInts(int i, int...js){
            int sum=i;
            for(int x : js) sum+=x;
            return sum;
        }
    

    Начиная с Java 8, у нас также могут быть статические методы в интерфейсах. Для получения более подробной информации читайте Изменения в интерфейсах Java 8.

  3. Статический блок Java

    Статический блок Java – это группа операторов, которая выполняется, когда класс загружается в память с помощью Java ClassLoader. Статический блок используется для инициализации статических переменных класса. В основном его используют для создания статических ресурсов при загрузке класса. Мы не можем получить доступ к нестатическим переменным в статическом блоке. В классе может быть несколько статических блоков, хотя это не имеет особого смысла. Код статического блока выполняется только один раз, когда класс загружается в память.

        static{
            //может использоваться для инициализации ресурсов при загрузке класса
            System.out.println("Статический блок примера Java");
            //может получать доступ только к статическим переменным и методам
            str="Тест";
            setCount(2);
        }
    
  4. Статический класс Java

    Мы можем использовать ключевое слово static с вложенными классами. Ключевое слово static нельзя использовать с классами верхнего уровня. Статический вложенный класс такой же, как и любой другой класс верхнего уровня, и вложен только для удобства упаковки. Читать: Вложенные классы Java

Давайте посмотрим на все использования ключевого слова static в Java в примерной программе. StaticExample.java

package com.journaldev.misc;

public class StaticExample {

    //статический блок
    static{
        //может использоваться для инициализации ресурсов при загрузке класса
        System.out.println("StaticExample static block");
        //может получить доступ только к статическим переменным и методам
        str="Test";
        setCount(2);
    }
    
    //несколько статических блоков в одном классе
    static{
        System.out.println("StaticExample static block2");
    }
    
    //пример статической переменной
    private static int count; //kept private to control its value through setter
    public static String str;
    
    public int getCount() {
        return count;
    }

    //пример статического метода
    public static void setCount(int count) {
        if(count > 0)
        StaticExample.count = count;
    }
    
    //статический утилитный метод
    public static int addInts(int i, int...js){
        int sum=i;
        for(int x : js) sum+=x;
        return sum;
    }

    //пример статического класса - используется только для удобства упаковки
    public static class MyStaticClass{
        public int count;
        
    }

}

Давайте посмотрим, как использовать статическую переменную, метод и статический класс в тестовой программе. TestStatic.java

package com.journaldev.misc;

public class TestStatic {

    public static void main(String[] args) {
        StaticExample.setCount(5);
        
        //неприватные статические переменные могут быть доступны с именем класса
        StaticExample.str = "abc";
        StaticExample se = new StaticExample();
        System.out.println(se.getCount());
        //статические переменные класса и экземпляра одинаковы
        System.out.println(StaticExample.str +" is same as "+se.str);
        System.out.println(StaticExample.str == se.str);
        
        //статические вложенные классы похожи на обычные классы верхнего уровня
        StaticExample.MyStaticClass myStaticClass = new StaticExample.MyStaticClass();
        myStaticClass.count=10;
        
        StaticExample.MyStaticClass myStaticClass1 = new StaticExample.MyStaticClass();
        myStaticClass1.count=20;
        
        System.out.println(myStaticClass.count);
        System.out.println(myStaticClass1.count);
    }
    
}

Вывод вышеприведенной примерной программы с ключевым словом static в Java:

StaticExample static block
StaticExample static block2
5
abc is same as abc
true
10
20

Обратите внимание, что код статического блока выполняется первым и только один раз, как только класс загружается в память. Другие выводы являются самоочевидными.

Java статический импорт

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

package com.journaldev.test;

public class A {

	public static int MAX = 1000;
	
	public static void foo(){
		System.out.println("foo static method");
	}
}
package com.journaldev.test;

import static com.journaldev.test.A.MAX;
import static com.journaldev.test.A.foo;

public class B {

	public static void main(String args[]){
		System.out.println(MAX); //normally A.MAX
		foo(); // normally A.foo()
	}
}

Обратите внимание на оператор импорта, для статического импорта мы должны использовать import static, за которым следует полностью классифицированный статический элемент класса. Для импорта всех статических элементов класса мы можем использовать * как в import static com.journaldev.test.A.*;. Мы должны использовать это только тогда, когда мы используем статическую переменную класса несколько раз, это неудобно для чтения. Обновление: Я недавно создал видео, чтобы объяснить статическое ключевое слово в Java, вы должны посмотреть его ниже. https://www.youtube.com/watch?v=2e-l1vb\_fwM

Source:
https://www.digitalocean.com/community/tutorials/static-keyword-in-java