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

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

Открыта

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
Комментарии (293)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Anonymous #6463865
Уровень 12
позавчера, 07:23
package com.javarush.task.pro.task11.task1101;
/* Солнечная система — наш дом */

public class Solution {

    public static void main(String[] args) {

        System.out.println("Человечество живет в Солнечной системе.");
        System.out.println("Ее возраст около " + SolarSystem.age + " лет.");
        System.out.println("В Солнечной системе " + SolarSystem.planetsCount + " известных планет.");
        System.out.println("Как и большинство звездных систем, состоит из " + SolarSystem.starsCount + " звезды.");
        System.out.println("Звезды по имени " + SolarSystem.starName + ".");
        System.out.println("Расстояние к центру галактики составляет " + SolarSystem.galacticCenterDistance + " световых лет.");
        System.out.println("Каждый обитатель Солнечной системы должен знать эту информацию!");

    }
}
Euraks Backend Developer
27 сентября, 05:29
Для понимания статических переменных попробуйте осмыслить это и тогда статик дальше хорошо пойдет.
SolarSystem system = null;

System.out.println("Ее возраст около " + SolarSystem.age + " лет.");
ошибки компиляции не будет так как для статик не нужен экземпляр класса, достаточно только того что он уже создан при загрузке, объявление дает ссылку на экземпляр а статическое поле уже лежит в памяти
Paul
Уровень 2
8 июля, 18:51
Ребята, если кому-то непонятно, давайте объясню :) Дело в том, что "статический объект класса" на самом деле не создается. Это не "объект", который создается через 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 !!
    }
}
Вот и все :) И когда мы говорим, что "статические переменные существуют в единственном экземпляре, общем для всех объектов", мы говорим, что объекты, изменяя это статическое поле, видят изменения друг друга.
Euraks Backend Developer
27 сентября, 05:26
Статическое поле создается сразу при создании объекта. И принадлежит оно классу а не объекту, где то в медатанных лежит себе Person у которого есть count и сколько на экземплярах не вызывай его находится он на объекте 1 на всех.
Grigoryvvv
Уровень 28
Expert
24 декабря 2025, 22:04
25.12.2025 / 12 уровень Статический объект это то же самое, что обозначалось "зеленым прямоугольником" в предыдущей лекции про загрузку классов. Статический объект создаётся при первоначальной загрузке класса в JVM, а Обычный объект создаётся уже по мере выполнения программы.
Big198801
Уровень 35
24 августа 2025, 05:45
Всем привет!) обычно читал комменты, нежели писал сам) Имею за плечами пару вялых попыток освоить Java за последние полгода. И вот по скидке на премиум Залетел сюда 12.08.25. На текущий момент дошел до 12 lvl. В целом, материал усваивается хорошо. Задачек много, для практики прям супер полезно. Ранее я чаще по теории пробегался. Читаешь, вроде все ясно-понятно, а потом через недельку такой - Whaat?)) А тут прям кайфууууешь от того что решаешь. Ну или подгорает, от того что тупой и не можешь сам в задачках про конвертеры в разные системы исчисления (надеюсь, не один такой ) Дальше - больше, пока все нравится)
invoker main
Уровень 42
16 сентября 2025, 15:45
про конвертеры в точку, сидишь и думаешь что ты горе программист, но потом с гпт все разбираешь и понимаешь как это работает
17 августа 2025, 15:37
Ушло 10 минут на задачи, 5 из них чтобы копировать код и вставить в идею, 1 - минута на то, чтобы ознакомиться с условиями задачи. Учу меньше месяца, результатом доволен. Господа, не сдаемся учить и совершенствоваться, каждый шаг это победа над самим собой, удачи Вам, а я побежал дальше.
Anonymous #3605187
Уровень 14
1 сентября 2025, 17:14
Почему-то, я все еще не научился решать задачи так-же, как и вы..
REK.QA
Уровень 13
4 августа 2025, 07:13
Подскажите (мож я упустил), что такое в скобках %d и остальные проценты: System.out.printf("Я %d-й из %d роботов. Модель: %s. Произведен компанией %s в %d году.\n", id, robotCounter, model, vendor, productionYear);
Anonymous #3603283
Уровень 25
6 августа 2025, 08:41
экранирование символов, называются escape-последовательностями. об этом рассказывалось на 10 уровне 3 лекции
REK.QA
Уровень 13
7 августа 2025, 17:29
из экранирования нашел только \n - перенос строки.
Tumanov Gennadiy #3044820
Уровень 18
28 октября 2025, 11:55
Это формат, было в предыдущих лекциях. %s - вставить строку, %d - вставить число. %2$d - вставить второе число из списка. Там после этих процентов идёт список переменных, которые встают на места этих процентов.
Александр
Уровень 87
26 декабря 2025, 15:38
Конечно же это не экранирование и ни escape последовательности! Это спецификаторы String.format.
Руслан
Уровень 48
17 июля 2025, 22:22
🔹 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, 22:23
Это все что происходит с static при первом обращении к классу
Anonymous #3585174
Уровень 33
25 июня 2025, 08:08
like
Олеся
Уровень 1
22 мая 2025, 18:51
Хотелось бы прояснить: статический объект класса - это то же самое, что обозначалось "зеленым прямоугольником" в предыдущей лекции про загрузку классов?
Grigoryvvv
Уровень 28
Expert
28 декабря 2025, 21:54
Да.