Ключевое слово static в java может применяться к переменным, методам, блокам, импорту и внутренним классам. В этом уроке мы изучим эффект использования ключевого слова static в этих местах с примерами.
1. Статическая переменная
Чтобы объявить переменную статической, используйте ключевое слово static в объявлении переменной. Синтаксис статической переменной:
ACCESS_MODIFER статический DATA_TYPE VARNAME;
Например, таким образом объявляется публичная статическая переменная типа Integer.
public static Integer staticVar;
Самое важное в статических переменных — то, что они принадлежат уровню класса. Это означает, что во время выполнения может быть только одна копия переменной.
Когда вы определяете статическую переменную в определении класса, каждый экземпляр класса будет иметь доступ к этой единственной копии. Отдельные экземпляры класса не будут иметь своей собственной локальной копии, как это происходит с нестатическими переменными.
public class JavaStaticExample{public static void main(String[] args){DataObject objOne = new DataObject();objOne.staticVar = 10;objOne.nonStaticVar = 20;DataObject objTwo = new DataObject();System.out.println(objTwo.staticVar); //10System.out.println(objTwo.nonStaticVar); //nullDataObject.staticVar = 30; //Direct AccessSystem.out.println(objOne.staticVar); //30System.out.println(objTwo.staticVar); //30}}class DataObject {public static Integer staticVar;public Integer nonStaticVar;}Output:10null3030
Обратите внимание, как мы изменили значение на 30, и теперь оба объекта видят обновленное значение, равное 30.
Еще одна вещь, которую вы должны были заметить, это то, как мы можем получить доступ к статической переменной с ее именем класса, т.е. DataObject.staticVar. Нам не нужно создавать какой-либо экземпляр для доступа к статическим переменным. Это ясно показывает, что статические переменные принадлежат области видимости класса.
2. Статический метод
Чтобы объявить статический метод, используйте ключевое слово static в объявлении метода. Синтаксис статического метода:
ACCESS_MODIFER статический RETURN_TYPE ИМЯ_МЕТОДА;
Например, таким образом объявляется публичная статическая переменная типа Integer.
public static Integer staticVar;public static Integer getStaticVar(){return staticVar;}
Несколько вещей, которые следует запомнить.
- Вы можете получить доступ только к статическим переменным внутри статических методов. Если вы попытаетесь получить доступ к любой нестатической переменной, будет сгенерирована ошибка компилятора с сообщением «Невозможно создать статическую ссылку на нестатическое поле nonStaticVar».
- Доступ к статическим методам можно получить через ссылку на класс, и нет необходимости создавать экземпляр класса. Хотя вы можете получить доступ и через ссылку на экземпляр, но это не будет иметь никакой разницы по сравнению с доступом через ссылку на класс.
- Статические методы также относятся к области действия уровня класса.
public class JavaStaticExample{public static void main(String[] args){DataObject.staticVar = 30; //Direct AccessInteger value1 = DataObject.getStaticVar(); //access with class referenceDataObject objOne = new DataObject();Integer value2 = objOne.getStaticVar(); //access with instance referenceSystem.out.println(value1);System.out.println(value2);}}class DataObject{public Integer nonStaticVar;public static Integer staticVar; //static variablepublic static Integer getStaticVar(){return staticVar;}}Output:3030
3. Статический оператор импорта
Объявление обычного импорта импортирует классы из пакетов, так что их можно использовать без ссылки на пакет. Аналогично, объявление статического импорта импортирует статические члены из классов и позволяет использовать их без ссылки на класс.
Оператор статического импорта также бывает двух видов: single-static import и static-import-on-demand. Объявление single-static import импортирует один статический член из типа. Объявление static-import-on-demand импортирует все статические члены типа.
//Single-static-import declaration:import static <<package name>>.<<type name>>.<<static member name>>;//Static-import-on-demand declaration:import static <<package name>>.<<type name>>.*;
Например, System.out — это
//Static import statementimport static java.lang.System.out;public class JavaStaticExample{public static void main(String[] args){DataObject.staticVar = 30;out.println(DataObject.staticVar); //Static import statement example}}class DataObject{public static Integer staticVar; //static variable}Output:30
Подробнее: Статические операторы импорта в Java
4. Статический блок
Статические блоки — это часть кода инициализации класса, заключенная в ключевое слово static.
public class Main {//static initializerstatic {System.out.println("Inside static initializer");}}
Статические блоки выполняются, когда класс загружается в память. Класс может иметь несколько статических блоков, и они будут выполняться в той же последовательности, в которой они появляются в определении класса.
import static java.lang.System.out;class DataObject{public Integer nonStaticVar;public static Integer staticVar; //static variable//It will be executed firststatic {staticVar = 40;//nonStaticVar = 20; //Not possible to access non-static members}//It will be executed secondstatic {out.println(staticVar);}}Output:40
5. Статический класс
В Java вы можете иметь статический класс как внутренний класс. Как и другие статические члены, вложенные классы принадлежат области видимости класса, поэтому к внутреннему статическому классу можно получить доступ без наличия объекта внешнего класса.
public class JavaStaticExample{public static void main(String[] args){//Static inner class exampleSystem.out.println( DataObject.StaticInnerClas.innerStaticVar );}}class DataObject{public Integer nonStaticVar;public static Integer staticVar; //static variablestatic class StaticInnerClas {Integer innerNonStaticVar = 60;static Integer innerStaticVar = 70; //static variable inside inner class}}
Обратите внимание, что статический внутренний класс не может получить доступ к нестатическим членам внешнего класса. Он может получить доступ только к статическим членам внешнего класса.
public class JavaStaticExample{public static void main(String[] args){//Static inner class exampleDataObject.StaticInnerClas.accessOuterClass();}}class DataObject{public Integer nonStaticVar;public static Integer staticVar; //static variablestatic {staticVar = 40;//nonStaticVar = 20; //Not possible to access non-static members}public static Integer getStaticVar(){return staticVar;}static class StaticInnerClas{public static void accessOuterClass(){System.out.println(DataObject.staticVar); //static variable of outer classSystem.out.println(DataObject.getStaticVar()); //static method of outer class}}}Output:40
6. Резюме
Давайте подведем итоги использования ключевых слов static в Java.
- Статические члены принадлежат классу. Нет необходимости создавать экземпляр класса для доступа к статическим членам.
- Доступ к статическим членам(переменным и методам) возможен только внутри статических методов и статических блоков.
- К нестатическим членам нельзя получить доступ внутри статических методов, блоков и внутренних классов.
- Класс может иметь несколько статических блоков, и они будут выполняться в том порядке, в котором они указаны в определении класса.
- Класс может быть статическим, только если он объявлен как внутренний класс внутри внешнего класса.
- Статический импорт может использоваться для импорта всех статических членов из класса. На эти члены можно ссылаться без ссылки на класс.
Ссылки: