JavaRush /Курсы /Java Syntax Pro /Статические переменные

Статические переменные

Java Syntax Pro
11 уровень , 1 лекция
Открыта

1. Статические переменные

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

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

Статическая (static) же переменная привязана к статическому объекту класса и всегда существует в единственном экземпляре.

Чтобы создать статическую переменную класса, нужно перед ее именем написать ключевое слово static. Общий вид объявления статической переменной такой:

static Тип имя = значение;

Если статической переменной не присвоить стартовое значение, она инициализируется значением по умолчанию:

Тип Значение по умолчанию
byte
0
short
0
int
0
long
0
float
0.0
double
0.0
char
'\u0000'
(то же самое, что и
0
)
boolean
false
Object
и любые классы
null

Примеры:

Код
public static int WIDTH = 100;
public static String message = "Hello";
private static Scanner console;
private static int count = 0;
private static boolean flag;

Обращаться к статической переменной в ее классе можно просто по имени. Если обращение идет из другого класса, то перед именем статической переменной нужно писать имя класса.

ИмяКласса.переменная

Пример:

Переменная Класс Обращение к переменной вне класса
public static int WIDTH = 100;
Solution
Solution.WIDTH
public static String message = "Hello";
Main
Main.message
private static Scanner console;
JavaGame
Переменная private, вне класса не видна
private static int count = 0;
Counter
Переменная private, вне класса не видна
private static boolean flag;
Arithmetic
Переменная private, вне класса не видна


2. Отличие статических и нестатических переменных

Нестатические (обычные) переменные класса объявляются точно так же, как статические, только без ключевого слова static.

Чем же отличаются обычные и статические переменные?

Обычные переменные класса привязаны к объектам своего класса (экземплярам класса), статические переменные — к статическому объекту класса.

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

Обращаться к обычным переменным класса (полям класса) можно только имея ссылку на объект класса. Ну или в методах внутри этого же класса.

Пример:

Обращение к полю класса с использованием ссылки на объект класса
public class DataInfo
{
   public int value = 100;
}

public class Solution
{
   public static void main(String[] args)
   {
      DataInfo info = new DataInfo();
      System.out.println(info.value);
   }
}

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

Пример:

Обращение к статическому полю класса не используя ссылку на объект класса
public class DataInfo
{
   public static int value = 100;
}

public class Solution
{
   public static void main(String[] args)
   {
      System.out.println(DataInfo.value);
   }
}

Устройство в памяти:

Допустим, у нас есть класс Person с 4 полями: два статических, а два — нет.

public class Person
{
   public static int count = 0;
   public static int sum = 0;
   public int age = 0;
   public String name;
}

Сразу после загрузки класса

Когда Java-машина завершит загрузку класса Person, в памяти у нас будет наблюдаться такая картина:

Отличие статических и нестатических переменных

После создания первого объекта

Если мы создадим объект класса Person, картинка станет такой

Отличие статических и нестатических переменных 1

Обратите внимание, что хоть у объектов по две переменные, это разные переменные: у обычного объекта — обычные, у статического — статические.

Нужно больше объектов

Давайте создадим еще два объекта, типа Person. Новая картина будет выглядеть так:

Отличие статических и нестатических переменных 2

Обратите внимание: у каждого объекта есть собственная переменная age и name.



3 Удаление и добавление модификатора static

Из статической в обычную

Что будет, если мы возьмем статическую переменную и превратим ее в обычную: удалим у нее модификатор static? Например, у переменной static int sum.

Измененный код будет выглядеть так:

public class Person
{
   public static int count = 0;
   public int sum = 0;
   public int age = 0;
   public String name;
}

А в памяти мы получим такую картину:

Удаление и добавление модификатора static

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

Из обычной в статическую

Можно сделать и наоборот: добавить перед обычными переменными класса модификатор static, и тогда они исчезнут у всех объектов и появятся у статического объекта. Допустим, мы решили сделать переменные age и name статическими. Тогда код будет выглядеть так:

public class Person
{
   public static int count = 0;
   public int sum = 0;
   public static int age = 0;
   public static String name;
}

А в памяти мы получим уже такую картину:

Удаление и добавление модификатора static
Комментарии (295)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Paul Уровень 14
8 июля 2026
Ребята, если кому-то непонятно, давайте объясню :) Дело в том, что "статический объект класса" на самом деле не создается. Это не "объект", который создается через new, в привычном понимании Java. Это просто общий кусочек памяти, доступный всем объектам. Объекты просто ходят в этот кусочек памяти и могут менять его содержимое:

public class Person {
    static int count = 0; // общий счётчик для всех
    String name;

    public Person(String name) {
        this.name = name;
        count++; // каждый новый объект увеличивает ОБЩИЙ счётчик
    }

    public void printCount() {
        System.out.println(name + " видит count = " + count);
    }
}
А теперь смотрите, что происходит, когда разные объекты обращаются к статическому полю:

public class Main {
    public static void main(String[] args) {
        Person p1 = new Person("Аня");
        p1.printCount(); // Аня видит count = 1

        Person p2 = new Person("Боря");
        p2.printCount(); // Боря видит count = 2

        p1.printCount(); // Аня видит count = 2 !!
    }
}
Вот и все :) И когда мы говорим, что "статические переменные существуют в единственном экземпляре, общем для всех объектов", мы говорим, что объекты, изменяя это статическое поле, видят изменения друг друга.
Grigoryvvv Уровень 18 Expert
24 декабря 2025
25.12.2025 / 12 уровень Статический объект это то же самое, что обозначалось "зеленым прямоугольником" в предыдущей лекции про загрузку классов. Статический объект создаётся при первоначальной загрузке класса в JVM, а Обычный объект создаётся уже по мере выполнения программы.
Big198801 Уровень 34
24 августа 2025
Всем привет!) обычно читал комменты, нежели писал сам) Имею за плечами пару вялых попыток освоить Java за последние полгода. И вот по скидке на премиум Залетел сюда 12.08.25. На текущий момент дошел до 12 lvl. В целом, материал усваивается хорошо. Задачек много, для практики прям супер полезно. Ранее я чаще по теории пробегался. Читаешь, вроде все ясно-понятно, а потом через недельку такой - Whaat?)) А тут прям кайфууууешь от того что решаешь. Ну или подгорает, от того что тупой и не можешь сам в задачках про конвертеры в разные системы исчисления (надеюсь, не один такой ) Дальше - больше, пока все нравится)
invoker main Уровень 42
16 сентября 2025
про конвертеры в точку, сидишь и думаешь что ты горе программист, но потом с гпт все разбираешь и понимаешь как это работает
17 августа 2025
Ушло 10 минут на задачи, 5 из них чтобы копировать код и вставить в идею, 1 - минута на то, чтобы ознакомиться с условиями задачи. Учу меньше месяца, результатом доволен. Господа, не сдаемся учить и совершенствоваться, каждый шаг это победа над самим собой, удачи Вам, а я побежал дальше.
Anonymous #3605187 Уровень 14
1 сентября 2025
Почему-то, я все еще не научился решать задачи так-же, как и вы..
REK.QA Уровень 4
4 августа 2025
Подскажите (мож я упустил), что такое в скобках %d и остальные проценты: System.out.printf("Я %d-й из %d роботов. Модель: %s. Произведен компанией %s в %d году.\n", id, robotCounter, model, vendor, productionYear);
Anonymous #3603283 Уровень 25
6 августа 2025
экранирование символов, называются escape-последовательностями. об этом рассказывалось на 10 уровне 3 лекции
REK.QA Уровень 4
7 августа 2025
из экранирования нашел только \n - перенос строки.
Tumanov Gennadiy #3044820 Уровень 18
28 октября 2025
Это формат, было в предыдущих лекциях. %s - вставить строку, %d - вставить число. %2$d - вставить второе число из списка. Там после этих процентов идёт список переменных, которые встают на места этих процентов.
Александр Уровень 66
26 декабря 2025
Конечно же это не экранирование и ни escape последовательности! Это спецификаторы String.format.
Руслан Уровень 48
17 июля 2025
🔹 1. Происходит загрузка (class loading) JVM загружает .class файл в память (в Metaspace). 🔹 2. Происходит аллокация памяти для static-полей JVM выделяет память под static переменные (в специальной области, связанной с классом — не в heap). 🔹 3. Выполняется инициализация static поля получают свои значения. Выполняются static блоки в порядке их написания в коде. 🔁 Всё это происходит: ✅ Один единственный раз за всё время жизни класса в JVM. ✅ Только при первом активном использовании (вызов static метода, обращение к static переменной, new, Class.forName() и т.д.). ❌ Не происходит при просто объявлении переменной типа класса без использования. ✅ ИТОГ: ✔️ Да, аллокация и инициализация static содержимого происходят только один раз — при первом обращении к классу. А не статик также работает? Краткий ответ: не-static (нестатические) поля и блоки работают по-другому, в отличие от static. 🔹 Главное отличие: | Тип поля или блока | Когда выполняется | Сколько раз выполняется | | ------------------ | --------------------------------------- | ----------------------------------- | | `static` | Один раз при первом обращении к классу | ❗ Один раз за весь запуск программы | | **`non-static`** | При **каждом создании объекта (`new`)** | ✅ Каждый раз заново |
Руслан Уровень 48
17 июля 2025
Это все что происходит с static при первом обращении к классу
Anonymous #3585174 Уровень 33
25 июня 2025
like
Олеся Уровень 1
22 мая 2025
Хотелось бы прояснить: статический объект класса - это то же самое, что обозначалось "зеленым прямоугольником" в предыдущей лекции про загрузку классов?
Grigoryvvv Уровень 18 Expert
28 декабря 2025
Да.
Anonymous #3570151 Уровень 19
12 мая 2025
все чаще начинаешь пользоваться гуглом для разбора темы
Sergei Kostylev Уровень 19
19 апреля 2025
Что такое статический объект класса? Это абстракция, придуманная для этой лекции? Или что-то реально существующее? Из того, что я читал, статические переменные хранятся в специальной области памяти (Metaspace) и никаких объектов не создается для этого.
Андрей Уровень 1
30 апреля 2025
Спасибо за вопрос. Изза твоего комментария пошел изучать и: Когда ты пишешь static int count = 0; Java-машина при загрузке класса (до создания объектов) создаёт в Metaspace структуру для этого класса. В этой структуре размещается ячейка памяти под count. Ты не создаёшь объект, и Java тоже не создаёт объект в куче. Просто выделяется память под значение count. 🔸 То есть: Это не объект, и не через new. Это просто участок памяти, привязанный к классу. Он создаётся один раз при загрузке класса, и существует сам по себе, независимо от new. ✅ Вывод: Когда ты пишешь static, ты не создаёшь объект вообще. Ты просто говоришь JVM: "вот переменная, она общая для всех экземпляров, храни её при классе".
Дени Ахмадов Уровень 18
6 августа 2025
Да. А в куче будут храниться именно объектные переменные. И как такового статического объекта для статических полей оказывается нет. Статические поля хранятся и в MetaSpace и Heap(объектные поля в Метаспейс, а примитивные в специальных областях памяти, как вы сказали, при классе). А со статическими методами ещё проще: байт-код их методов просто хранится в MetaSpace, структуре которая создаётся при загрузке JVM .class файла, который и содержит всю метаинформацию класса.