Модификатор static в Java: переменные
Данная статья:
- написана командой Vertex Academy. Надеемся, что она Вам будет полезна. Приятного прочтения!
- это одна из статей из нашего "Самоучителя по Java"
Что такое модификатор static
Если Вы читали наши предыдущие статьи, то уже знаете, что модификаторы - это ключевые слова в Java, которые "изменяют и регулируют" работу классов, методов и переменных.
Сегодня мы рассмотрим работу модификатора static - переводится как "статичный", "постоянный", "неизменный". Действительно, его задача - сделать переменную или метод "независимыми" от объекта.
Вам надо знать две основные вещи, которые мы объясним далее:
1. Если метод (переменная) имеет модификатор static, то это значит, что она объявляется для класса. Без этого модификатора - для объектов:
2. Из-за того, что статический метод/переменная связана с классом, а не объектом (см. пункт 1), их можно вызывать без создания объекта класса.
Теперь Вы знаете, на что нужно обращать внимание. В этой статье мы рассмотрим, как применяется модификатор static к полям. В следующей статье, мы рассмотрим его применение к методам.
Модификатор static для полей
Принцип 1
Давайте рассмотрим, как работает модификатор static при работе с переменными. Представим, что у нас есть класс Car и класс Test, в котором лежит метод main, из которого мы обращаемся к классу Car:
1 2 3 4 5 6 7 8 9 10 |
public class Test{ public static void main (String args[]){ } } public class Car{ } |
Представим, что в классе Car лежат две переменные - одна статическая, а другая нет:
1 2 3 4 |
public class Car{ static int myStatic = 100; int notStatic = 0; } |
Теперь, создадим в нашем главном классе - классе Test - новый объект класса Car:
1 2 3 4 5 |
public class Test{ public static void main (String args[]){ Car myCar = new Car(); } |
Давайте теперь обратимся к нашим переменным - статической myStatic и "обычной" notStatic. Мы можем свободно их использовать - например, выводить на экран:
1 2 3 4 5 6 7 8 |
public class Test{ public static void main (String args[]){ Car myCar = new Car(); System.out.println(myCar.myStatic); System.out.println(myCar.notStatic); } |
Мы получим:
100
0
А теперь давайте попробуем выполнить тот же код, но уже без создания объекту класса (т.е. вычеркнем строчку "Car myCar = new Car();"):
1 2 3 4 5 6 7 |
public class Test{ public static void main (String args[]){ System.out.println(Car.myStatic); System.out.println(Car.notStatic); } |
Код работать не будет, потому что ко второй переменной - notStatic - нельзя обращаться без создания объекта. Но если попробовать вывести только первую переменную - myStatic - код будет правильным:
1 2 3 4 5 6 7 |
public class Test{ public static void main (String args[]){ System.out.println(Car.myStatic); } |
Дело в том, что, как мы уже говорили, к статическим переменным можно обращаться без создания объекта класса.
Принцип 2
А теперь, давайте продемонстрирует еще один принцип работы static - переменная с этим модификатором одна для всех объектов класса.
Итак, представим, что у нас есть тот же класс - Car:
1 2 3 4 |
public class Car{ static int myStatic = 100; int notStatic = 0; } |
В классе Test увеличим значение статической переменной и выведем её на экран:
1 2 3 4 5 6 7 |
public class Test{ public static void main (String args[]){ Car.myStatic += 20; System.out.println(Car.myStatic); } |
Значение переменной myStatic увеличится - и она будет равна 120.
Теперь, создадим новый объект класса Car:
1 2 3 4 5 6 7 8 9 |
public class Test{ public static void main (String args[]){ Car.myStatic += 20; System.out.println(Car.myStatic); Car c1 = new Car(); } |
Что случится, если вывести на экран переменные нового объекта c1?
1 2 3 4 5 6 7 8 9 10 11 12 |
public class Test{ public static void main (String args[]){ Car.myStatic += 20; System.out.println(Car.myStatic); Car c1 = new Car(); System.out.println("Статическая переменная c1 = "+c1.myStatic); System.out.println("Не статическая переменная c1 = "+c1.notStatic); } |
Мы получим:
Статическая переменная c1 = 120;
Не статическая переменная c1 = 0;
То есть не смотря на создание нового объекта, наше статическое поле не изменилось. Но такого бы не произошло с "обычной"переменной notStatic, которая каждый раз создается заново. Посмотрим на следующий код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public class Test{ public static void main (String args[]){ Car.myStatic += 20; System.out.println(Car.myStatic); Car c1 = new Car(); System.out.println("Статическая переменная c1 = "+c1.myStatic); c1.notStatic +=20; System.out.println("Не статическая переменная c1 = "+c1.notStatic); Car c2 = new Car(); } |
Теперь переменные равны 120 и 20. Кроме того, у нас есть новый объект класса Car - c2. Как Вы считаете, чему будет равны переменные myStatic и notStatic для нового объекта?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public class Test{ public static void main (String args[]){ Car.myStatic += 20; System.out.println(Car.myStatic); Car c1 = new Car(); System.out.println("Статическая переменная c1 = "+c1.myStatic); c1.notStatic +=20; System.out.println("Не статическая переменная c1 = "+c1.notStatic); Car c2 = new Car(); System.out.println("Статическая переменная c2 = "+c2.myStatic); System.out.println("Не статическая переменная c2 = "+c2.notStatic); } |
Результат будет следующим:
Статическая переменная c1 = 120;
Не статическая переменная c1 = 20;
Статическая переменная c2 = 120;
Не статическая переменная c2 = 0;
Видно, что статическая переменная имеет одинаковое значение, а не статическая - разные. Это происходит потому, что не статическая переменная "создается заново" для каждого объекта, а статическая является общей для всех объектов класса.
Константы
Есть еще один способ применения модификатора для полей. Если нужно объявить любую константу - например, = 3,14 - обязательно нужно использовать static. Они объявляются с использованием сочетание "static final":
1 2 3 4 5 |
public class Test{ public static final double pi= 3.14159265359; } |
Недостатки
Помните, что статические методы и переменные доступны вне своего класса. А это значит, что они могут быть "не защищены", и предоставлять нежелательный доступ к данным в программе. Будьте осторожны!
Подводим итог
Итак, Вы теперь знаете, что такое модификатор static и как он применяется при работе с полями. В следующей статье мы рассмотрим его применение в методах.
Напоследок напомним основные постулаты:
1. Статическая переменная объявляется для класса, а не для объекта.
2. Статическую переменную можно вызывать без создания объекта.
3. Все константы являются статическими.
4. При использовании модификатора следует помнить про безопасность элементов программы.
До новых встреч!
Статья написана Vertex Academy. Будем рады видеть Вас на наших курсах Java с нуля.