Модификатор static в java
В Java и любом объектно-ориентированном языке программирования, модификатор static в классе задает область видимости полей, констант и методов в рамках класса, но не его объектов. Кроме полей и методов может быть объявлен статический инициализатор в классе, который задает начальное значение полям при создании первого объекта через конструктор.
Для чего используют static
Как известно, класс является шаблоном для создания объектов, которые копируют все его поля и методы. Те поля и методы, которые обладают модификатором static не являются экземплярами создаваемых объектов, а самого класса. При вызове статического метода, вместо ссылки на объект в начале ставится имя класса.
Статические элементы несут общую информацию о самом классе. Главный исполняющий метод main также обладает модификатором static и запускается автоматически при выполнении программы. Без данного модификатора, для запуска программы, компилятор должен был-бы создать объект главного класса. Однако вместо этого, он запускает main от имени класса.
Пример:
public class newApp {
public static void Main(String[] args){
StatClassobj = new StatClass(5, Hello);
System.out.println(obj.v); \\ Ошибка, вызвать статический метод через объект невозможно, нужно вызывать через класс -> выход из программы
System.out.println(StatClass.v); \\ Отобразится 5
}
}classStatClass{
publicint x;
public String s;
public static int v = 100; \\ Статическоеполе
public void fun(){
System.out.println(«call method of object»);
}
public static void statFun(){ \\ Статическийметод
System.out.println(«call static method of class»);
}
StatClass(int a, String b){
this.x = a;
this.s = b;
}}
В примере выше были созданы статическое поле и метод. При попытке обратиться к полю v через созданный объект, компилятор определяет ошибку и прекращает работу. Чтобы обратиться к статическому полю, следует делать это через класс: StatClass.v. Также следует вызывать и его статический метод: StatClass.statFun().
Каждый создаваемый объект класса будет получать новые значения полей. Публичные поля и методы у каждого объекта свои. Когда статические поля всегда будут сохранять свое значение исключительно для класса. При этом, нельзя обратиться к статическому элементу используя ссылку-оператор this.
Статические константы
Константы являются теме статическими полями, только их значение нельзя изменить. Как и все статические элементы класса, к константам обращаются через имя класса, а не объекта. Изменение значения константы приведет к ошибке компиляции.
Пример:
publicclassApp{
public static void main(String[] args){
System.out.println(Const.cst); \\ 5
System.out.println(Const.cst+5); \\ Ошибка, прерываниекомпиляции
}
}
classConst{
public static intcst = 5;}
Статические инициализаторы
Статический инициализатор — это безымянный блок в классе с модификатором static. Он выполняет 2 задачи: инициализирует статические поля, методы и константы; выполняет операторы, записанные в него при создании самого первого объекта в классе. То есть, при вызове конструктора new, выполняются операторы инициализатора, а затем создается объект.
Вызов статического инициализатора осуществляется только перед созданием первого объекта — иного способа не предусмотрено.
Пример:
class App{
public static void Main(String[] args){
Something obj = new Something(5);
Something obj_1 = new Something(10);
}
}
class Something{
public static int number;static{ \\ Статический инициализатор
number = 10;
System.out.println(number);
}
Something(int x){
number +=x;
System.out.println(number);
}
}
Результат выполнения программы в консоли:
10
15
25
Как видно, сработал статический инициализатор и вывел первое значение переменной number. Затем сработал первый конструктор и увеличил number на 5, и второй, прибавив к переменной 10. Ключевым моментом здесь является первый вывод переменной number — это сработал статический инициализатор автоматически, перед тем как сработает первый конструктор obj.
Зачем используют статические переменные?
Это можно объяснить на примере из жизни. Пусть класс создает ящики с документами. Каждый ящик содержит свое количество документов — это публичные переменные. Статическая переменная же будет содержать информацию об общем количестве созданных ящиков. Здесь статические данные являются абстрактными, описывая производственные процессы.
Публичные переменные отвечают за параметры каждого отдельного ящика, поэтому к ним можно обратиться непосредственно через ящик. Однако, чтобы узнать статистические данные, придется обратиться к самому классу, который и является производителем этих самых ящиков.
Статические переменные могут быть как публичными, защищенными, так и приватными. Переменная с единственным модификатором static автоматически становится приватной.
Достоинством таких полей и методов является удобство организации кода. Они обеспечивают гибкие возможности для описания класса и манипуляций с объектами. Если в конструкторах объекта отсутствуют параметры, задающие публичные поля — свойства объекта, то статические поля остаются неизменными. Еще раз, статичная переменная не является свойством экземпляра, а всего класса, как и статические методы, которые делают изменения либо для свойств всех объектов, либо в рамках класса.
Заключение
Статические поля, константы и методы являются отдельными — абстрактными конструкциями класса. Их используют для описания общей информации, касательно производства объектов и манипуляций с ними. Статические поля могут выступать в качестве счетчиков и суммарных показателей. Статические методы обрабатывают различные данные, для класса и всех объектов. К статическим элементам обращаются через ссылку на класс, но не через отдельный объект.