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

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

Статическим может быть:

  • переменная (переменная класса);
  • метод (метод класса);
  • блок;
  • внутренний класс.

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

  • Статическая переменная может использоваться для обозначения общего свойства всех объектов (которое не является уникальным для каждого объекта), например название компании, колледжа и т. д.
  • Статическая переменная задействует память только один раз во время загрузки класса.

Преимущества статической переменной

Java static переменная не загружает память.

Пример, в котором не используется статическая переменная

class Student{  
     int rollno;  
     String name;  
     String college="ITS";  
}

Предположим, что в колледже 500 студентов. Класс Student будут задействовать память каждый раз при создании объекта. У всех студентов есть уникальное rollno и name. А college — это общее свойство для всех объектов. Если сделать его статическим, то поле будет задействовать память только один раз.

Статическое свойство Java является общим для всех объектов.

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

//Программа со статической переменной

class Student8{  
   int rollno;  
   String name;  
   static String college ="ITS";

   Student8(int r,String n){  
   rollno = r;  
   name = n;  
   }  
 void display (){System.out.println(rollno+" "+name+" "+college);}

 public static void main(String args[]){  
 Student8 s1 = new Student8(111,"Karan");  
 Student8 s2 = new Student8(222,"Aryan");

 s1.display();  
 s2.display();  
 }  
}

Проверить сейчас

Вывод:111 Karan ITS
	  222 Aryan ITS
staticvariable

Программа подсчета без статической переменной

В этом примере мы создаем Java static переменную count, которая увеличивается в конструкторе. Поскольку переменная экземпляра задействует память только во время создания объекта, то каждый объект ее копию. Поэтому при увеличении переменной он не будет влиять на другие объекты. Каждый объект получит значение 1 в переменной count.

class Counter{  
int count=0;//использует память при создании экземпляра

Counter(){  
count++;  
System.out.println(count);  
}

public static void main(String args[]){

Counter c1=new Counter();  
Counter c2=new Counter();  
Counter c3=new Counter();

 }  
}

Проверить сейчас

Вывод: 1
	  1
	  1

Программа подсчета со статической переменной

Java static переменная задействует память только один раз. Если какой-либо объект изменяет значение статической переменной, она сохраняет свое значение.

class Counter2{  
static int count=0;//использует память только один раз и сохраняет значение переменной

Counter2(){  
count++;  
System.out.println(count);  
}

public static void main(String args[]){

Counter2 c1=new Counter2();  
Counter2 c2=new Counter2();  
Counter2 c3=new Counter2();

 }  
}

Проверить сейчас

Вывод: 1
	  2
	  3

2) Статический метод Java

Если ключевое слово static применяется в объявлении метода, то это static method Java.

  • Статический метод относится к классу, а не к объекту класса;
  • Статический метод можно вызывать без создания экземпляра класса;
  • Статический метод может получать доступ к статическому члену и изменять его значение.

Пример статического метода

//Программа изменяет общее свойство всех объектов (статическое поле).

class Student9{  
     int rollno;  
     String name;  
     static String college = "ITS";

     static void change(){  
     college = "BBDIT";  
     }

     Student9(int r, String n){  
     rollno = r;  
     name = n;  
     }

     void display (){System.out.println(rollno+" "+name+" "+college);}

    public static void main(String args[]){  
    Student9.change();

    Student9 s1 = new Student9 (111,"Karan");  
    Student9 s2 = new Student9 (222,"Aryan");  
    Student9 s3 = new Student9 (333,"Sonoo");

    s1.display();  
    s2.display();  
    s3.display();  
    }  
}

Проверить сейчас

Вывод: 111 Karan BBDIT
	  222 Aryan BBDIT
	  333 Sonoo BBDIT

Другой пример Java static метода, выполняющего обычный расчет

//Программа для получения куба заданного числа статическим методом

class Calculate{  
  static int cube(int x){  
  return x*x*x;  
  }

  public static void main(String args[]){  
  int result=Calculate.cube(5);  
  System.out.println(result);  
  }  
}

Проверить сейчас

Вывод: 125

Ограничения для статического метода

Существует два основных ограничения для статического метода:

  1. Статический метод не может использовать нестатические члены или напрямую вызывать нестатические методы;
  2. this и super нельзя использовать в статическом контексте.
class A{  
 int a=40;//нестатический

 public static void main(String args[]){  
  System.out.println(a);  
 }  
}

Проверить сейчас

Вывод: Compile Time Error (ошибка времени компиляции)

Вопрос: почему основной main метод Java является статическим?

Ответ: поскольку объект не является обязательным для вызова статического метода, если он был нестатическим. Виртуальная машина сначала вызывает Java public static void main(), что приводит к выделению дополнительной памяти.

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

  • Применяется для инициализации статического члена;
  • Выполняется перед методом main во время загрузки класса.

Пример статического блока

class A2{  
  static{System.out.println("static block is invoked");}  
  public static void main(String args[]){  
   System.out.println("Hello main");  
  }  
}

Проверить сейчас

Вывод: static block is invoked
       Hello main

Вопрос: можно ли выполнить программу без метода main()?

Ответ: да, один из способов — применение модификатора static в Java, но в предыдущей версии JDK, а не в JDK 1.7.

class A3{  
  static{  
  System.out.println("static block is invoked");  
  System.exit(0);  
  }  
}

Проверить сейчас

Вывод: static block is invoked (если не JDK7)

В JDK7 и выше вывод будет следующим:

Output:Error: Main method not found in class A3, please define the main method as (метод main не найден в классе А3, определите метод main как):

public static void main(String[] args)

Перевод статьи “Java static keyword” был подготовлен дружной командой проекта Сайтостроение от А до Я.