Ключевое слово static в Java
Static в Java используется как ключевое слово используется для управления памятью. Его можно применять с переменными, методами, блоками и внутренними классами. В объявлении static относится к классу, а не экземпляру класса.
Статической может быть:
- переменная (переменная класса);
- метод (метод класса);
- блок;
- внутренний класс.
Статические переменные Java
- Статическая переменная может использоваться для обозначения общего свойства всех объектов (которое не является уникальным для каждого объекта), например название компании, колледжа и т. д.
- Статическая переменная задействует память только один раз во время загрузки класса.
Статические переменные в 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

Программа подсчета без статической переменной
В этом примере мы создаем 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
Статические методы 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
Ограничения для статического метода
Существует два основных ограничения для статического метода:
- Статический метод не может использовать нестатические члены или напрямую вызывать нестатические методы;
- 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(), что приводит к выделению дополнительной памяти.
Статический блок 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)