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

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

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

— Новая интересная тема. Хочу рассказать тебе о статических переменных и методах.

— О, я уже слышал про статические переменные. И про статические методы, кажется. Но хотелось бы больше подробностей.

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

Объявление класса
class Cat                        //класс
{
    String name;                 //переменная  

    Cat(String name)             //конструктор 
    {
        this.name = name;        //инициализация переменной 
    }
}
Код в методе main:
Cat cat1 = new Cat("Vaska"); //создали один объект, его name содержит строку «Vaska»
Cat cat2 = new Cat("Murka"); //создали один объект, его name содержит строку «Murka»
System.out.println(cat1.name);
System.out.println(cat2.name);
Вывод на экран будет таким:
Vaska
Murka

— Переменные cat1.name и cat2.name, хоть и описаны в одном классе – Cat, но хранят разные значения, т.к. привязаны к разным объектам.
— Это понятно.
— Статические же переменные – существуют в одном экземпляре, и обращаться к ним нужно по имени класса (внутри класса к статической переменной можно обращаться просто по имени):

Объявление класса
class Cat                   //класс
{
    String name;            //обычная переменная
    static int catCount;    //статическая переменная

    Cat(String name)
    {
        this.name = name;
        Cat.catCount++;   //увеличиваем значение статический переменной на 1
    }
}
Код в методе main:
System.out.println(Cat.catCount);
Cat cat1 = new Cat("Vaska");

System.out.println(Cat.catCount);
Cat cat2 = new Cat("Murka");

System.out.println(cat1.name);
System.out.println(cat2.name);
System.out.println(Cat.catCount);
Вывод на экран будет таким:
0
1
Vaska
Murka
2

— Это тоже понятно.

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

— Статические методы не могут обращаться к нестатическим методам или нестатическим переменным!

— А почему?

— Каждая обычная переменная класса находится внутри объекта. Обратиться к ней можно только имея ссылку на этот объект. В статический метод такая ссылка не передается.

— А в обычные методы передается?

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

— В статический метод вместо ссылки на объект передается null. Поэтому он не может обращаться к нестатическим переменным и методам – у него банально нет ссылки на объект, к которому они привязаны.

— Ясно.

— Так работают обычные нестатические методы:

Как выглядит код
Cat cat = new Cat();
String name = cat.getName();
cat.setAge(17);
cat.setChildren(cat1, cat2, cat3);
Что происходит на самом деле
Cat cat = new Cat();
String name = Cat.getName(cat);
Cat.setAge(cat, 17);
Cat.setChildren(cat, cat1, cat2, cat3);
При вызове метода в виде «объект» точка «имя метода», на самом деле вызывается метод класса, в который первым аргументом передаётся тот самый объект. Внутри метода он получает имя this. Именно с ним и его данными происходят все действия.

— А вот как работают статические методы:

Как выглядит код
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount();
Что происходит на самом деле
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount(null);
При вызове статического метода, никакого объекта внутрь не передаётся. Т.е. this равен null, поэтому статический метод не имеет доступа к нестатическим переменным и методам (ему нечего неявно передать в обычные методы).

— Переменная или метод являются статическими, если перед ними стоит ключевое слово static.

— А зачем такие методы нужны, если они так сильно ограничены?

— У такого подхода тоже есть свои преимущества.

— Во-первых, для того, чтобы обратиться к статическим методам и переменным не надо передавать никакую ссылку на объект.

— Во-вторых, иногда бывает нужно, чтобы переменная была в единственном экземпляре. Как, например, переменная System.out (статическая переменная out класса System).

— И в третьих, иногда нужно вызвать метод, еще до того, как будет возможность создавать какие-то объекты

— Это когда же?

— А почему, по-твоему, метод main объявлен статическим? Чтобы его можно было вызвать сразу после загрузки класса в память. Еще до того, когда можно будет создавать какие-то объекты.

6
Задача
Java Syntax Pro, 6 уровень, 6 лекция
Недоступна
Треугольный массив
Создай треугольный массив, где значение каждого элемента - это сумма его индексов. Например: array[7][3] = 7 + 3 = 10, array[3][0] = 3 + 0 = 3. Выведи массив на экран в следующем виде: 0 1 2 2 3 4 3 4 5 6 4 5 6 7 8 5 6 7 8 9 10 ... Числа в строке разделены пробелом. Задать треугольн
6
Задача
Java Syntax Pro, 6 уровень, 6 лекция
Недоступна
Создаем двумерный массив
Двумерный массив — это массив массивов, то есть в каждой его ячейке находится ссылка на некий массив. Но гораздо проще его представить в виде таблицы, у которой задано количество строк (первое измерение) и количество столбцов (второе измерение). В этой задаче мы будем создавать такой массив. Для эт
6
Задача
Java Syntax Pro, 6 уровень, 6 лекция
Недоступна
Создаем мультимассив
В методе main(String[]) выведи на экран все числа из трехмерного массива multiArray.
Комментарии (290)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
kiranis Уровень 13
3 июля 2023
В примере с переменной catCount ей нигде не присваивается значение 0.
Сергей Уровень 30 Expert
16 июля 2023
я так понимаю, что при создании переменной если она не иницилизируется сразу, то по умолчанию ей присваивается 0 если это числовая переменная и null если ссылочная
Максим Уровень 22 Expert
19 августа 2023
Совершенно верно. Это и есть значения по умолчанию
Emile Уровень 9
18 января 2023
Денис Тирских Уровень 26
31 декабря 2022
В кодах при сравнении используются все цвета радуги - это сбивает не опытного программиста. Лучше бы весь код был написан чёрным цветом, а то, что различается - красным.
Aлександр 52 Уровень 21
1 декабря 2022
У меня немного странный вопрос. Почему мы используем ключевое слово "static" и для переменных, и для методов, хотя принципы совсем разные? В первом случае "static" показывает, что переменная как бы общая для всех объектов класса, она как бы переменная всего класса. А во втором - что работа ведется только со статическими переменными и внутрь метода не передаются данные ни о каком объекте. Почему и то, и то статик? В чем логика использования и там, и там одного и того же ключевого слова?
Packoner Уровень 19
1 декабря 2022
в конце главы подробно написано, в пунктах "во первых" и т.д.
Aлександр 52 Уровень 21
2 декабря 2022
Спасибо. Потихоньку догоняю. Видимо, чувство со временем придет.
Евгений Уровень 9
26 августа 2022
Доп. материал про static https://metanit.com/java/tutorial/3.4.php
Ventre Cibus Уровень 8
4 августа 2022
на заметку, для понимания: статические переменные и методы можно вызывать без создания экземпляра класса. этого должно быть длостаточно на текущий момент.
hidden #2895522 Уровень 14
17 февраля 2022
Была прекрасная статья про Статик: https://javarush.com/groups/posts/modifikator-static-java Насколько, я понял: Если статик, то принадлежит классу, а не объекту класса. И неважно переменная эта или метод. Соответственно статик ни чего не может делать с объектом, раз объект не его.
Алексей Кобзев Уровень 37
17 июня 2022
"прекрасная статья ... насколько я понял..." Если статья хорошая, то ты бы понял все и не сомневался бы в этом))) Имхо плохая, тяжелая и запутанная статья. Некачественный перевод. Дважды перечитал, пробелы остались. Поищу потом еще информацию по теме, как понадобится. И скину сюда.
Aлександр 52 Уровень 21
1 декабря 2022
Не согласен. Иногда понимаешь, что что-то КРУТО, осознавая, что не понимаешь глубину этой КРУТОСТИ. Пример: классная песня в понимании меломана, который нот не знает. Отсюда вывод: узнаешь ноты, прочувствуешь крутость еще больше. Ну, или поймешь, что переоценивал песню. Бывает и такое. P.S. Метафора, конечно, не точная.
Andrei Уровень 7
22 ноября 2021
Vadim Zhalnin Уровень 17
8 июля 2021
Видимо, статические методы - это как-бы стратегические методы, они выполняют принципиальные задачи и поэтому важны в плане наследования. Отсюда и отделенность от объектов, то есть в одном ограниченность, зато в другом перспектива. Обычные методы более приземленные, и закрывают насущные потребности. Они не понадобятся дальше, так почему не упростить с ними работу сейчас. Статика, это кости, а обычные методы - мясо.
Vadim Zhalnin Уровень 17
8 июля 2021
a + bra = k + a + da + bra;
Максим Уровень 22 Expert
19 августа 2023
не скомпилируется