Java Static – переменная, метод, блок, класс и оператор импорта

Ключевое слово 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;}

Несколько вещей, которые следует запомнить.

  1. Вы можете получить доступ только к статическим переменным внутри статических методов. Если вы попытаетесь получить доступ к любой нестатической переменной, будет сгенерирована ошибка компилятора с сообщением «Невозможно создать статическую ссылку на нестатическое поле nonStaticVar».
  2. Доступ к статическим методам можно получить через ссылку на класс, и нет необходимости создавать экземпляр класса. Хотя вы можете получить доступ и через ссылку на экземпляр, но это не будет иметь никакой разницы по сравнению с доступом через ссылку на класс.
  3. Статические методы также относятся к области действия уровня класса.
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.

  1. Статические члены принадлежат классу. Нет необходимости создавать экземпляр класса для доступа к статическим членам.
  2. Доступ к статическим членам(переменным и методам) возможен только внутри статических методов и статических блоков.
  3. К нестатическим членам нельзя получить доступ внутри статических методов, блоков и внутренних классов.
  4. Класс может иметь несколько статических блоков, и они будут выполняться в том порядке, в котором они указаны в определении класса.
  5. Класс может быть статическим, только если он объявлен как внутренний класс внутри внешнего класса.
  6. Статический импорт может использоваться для импорта всех статических членов из класса. На эти члены можно ссылаться без ссылки на класс.

Ссылки:

Члены класса
Вложенные классы

Прокрутить вверх