Static — это ключевое слово в Java. Мы не можем создать имя класса или пакета с ключом static. В Java static может быть использовано в четырех случаях:
1. Статические переменные
В Java мы можем использовать ключевое слово static в переменной уровня класса. Статическая переменная класса и не принадлежит к объекту/экземпляру класса. Так, статические переменные являются общими для всех экземпляров объекта, они не потоко-безопасные. Обычно статические переменные используются с ключевым словом final для общих ресурсов или констант, которые могут быть использованы всеми объектами. Если статическая переменная не является private, то мы сможем получить к ней доступ следующим способом: ClassName.VARIABLENAME
1 2 3 4 |
//пример использования static-переменных private static int count; public static String str; public static final String DB_USER = "prologistic"; |
2. Java static методы. Как и статические переменные, статические методы принадлежат классу, а не к экземплярам класса. Статический метод может получить доступ только к статическим переменным класса и вызывать только статические методы класса. Обычно статические методы являются утилитными (вспомогательными) методами, которые должны быть использованы другими классами без необходимости создания экземпляра. Метод main() является точкой входа в любую JAVA-программу — он является статическим.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
//пример static метода public static void setCount(int count) { if(count > 0) StaticExample.count = count; } //static утилитный метод public static int addInts(int i, int...js){ int sum = i; for(int x : js) { sum += x; } return sum; } |
Интересно знать, что начиная с Java 8, мы также можем использовать статические методы и в интерфейсах.
3. Cтатический блок в Java: static блок c группой операторов используется для инициализации статических переменных класса. В основном он используется для создания статических ресурсов, когда класс загружается. Мы не можем получить доступ к не-статическим переменным в статическом блоке. Мы можем иметь несколько статических блоков в классе, хотя это не имеет особого смысла. Статический блок кода выполняется только один раз, когда класс загружается в память.
1 2 3 4 5 6 7 |
static{ //можем инициализировать ресурсы, когда блок загружен System.out.println("Это static блок"); //можем получить доступ только к статическим переменным и методам str="Test"; setCount(2); } |
4. Статический класс в Java: мы можем использовать ключевое слово static с вложенными классами. Ключевое слово static не может быть использовано с классами верхнего уровня. Статический вложенный класс такой же, как и любой другой класс верхнего уровня, только вложенный для удобства упаковки.
Давайте посмотрим все варианты использования ключевого слова static на примере Java-программы.
StaticExample.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
package ua.com.prologistic.staticx; public class StaticExample { //static блок static{ //инициализация происходит после загрузки класса System.out.println("Это static блок"); //доступ есть только к статическим переменным и методам str="Test"; setCount(2); } //несколько статических блоков в одном классе static{ System.out.println("Это static блок2"); } //статические переменные private static int count; public static String str; public int getCount() { return count; } //пример static-метода 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
package ua.com.prologistic.staticx; public class TestStatic { public static void main(String[] args) { StaticExample.setCount(5); //не private статические переменные //могут быть использованы без создания экземпляра класса StaticExample.str = "abc"; StaticExample se = new StaticExample(); System.out.println(se.getCount()); //доступ к переменным класса и через экземпляр System.out.println(StaticExample.str +" такая же, как "+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); } } |
Результат выполнения этой программы:
1 2 3 4 5 6 7 |
StaticExample static block StaticExample static block2 5 abc такая же, как abc true 10 20 |
Следите за обновлениями на Prologistic.com.ua