JavaRush /Курсы /Java Syntax /Видимость объектов и ссылка null.

Видимость объектов и ссылка null.

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

— Привет, Амиго!

— Привет, Элли! Что интересного расскажешь сегодня?

— Сегодня я расскажу тебе про время жизни объекта. Каждый объект после создания существует (живёт) пока хотя бы одна переменная хранит его адрес (на него есть хотя бы одна ссылка). Если ссылок больше не остаётся – объект умирает. Примеры:

public class MainClass
{
   public static void main (String[] args)
   {
    Tommy
     Cat cat = new Cat("Tommy");
     cat = null;
    
    Sammy
     Cat cat1 = new Cat("Sammy");
    Maisy
    Cat cat2 = new Cat("Maisy");
    cat2 = cat1;
    
    Ginger
    cat1 = new Cat("Ginger");
     cat2 = null;
    
    
   }
}

— Объект «кот Томми» существует всего одну строчку с момента создания. Уже на следующей строке единственную переменную, которая хранит на него ссылку, «обнуляют» и объект уничтожается Java-машиной.

— Объект «кот Семми» после создания хранится в переменной cat1. Или, если быть точным, там хранится ссылка на него. Парой строчек ниже эта ссылка копируется в cat2. После этого в cat1 сохраняется ссылка на другой объект, и ссылка на «кот Семми» остаётся только в cat2. Наконец, в последней строке метода main, последнюю ссылку на объект обнуляют.

— Объект «кот Мейси» существует сразу после создания всего одну строчку. На следующей строке переменной cat2 присваивают другое значение, и ссылка на «кот Мейси» теряется. Объект становится недостижимым и считается мусором (объект умер).

— Объект «кот Джинджер» существует сразу после создания и до конца метода. Вместе с окончанием метода будет уничтожена переменная cat1, и следом за ней и объект «кот Джинджер».

— Ясно.

— Но если создать объект Cat в каком-нибудь методе и сохранить ссылку на него в переменную класса, то объект Cat будет существовать все время, пока существует ссылка на него из другого живого объекта.

— Обычно объект уничтожается не сразу. Java-машина время от времени запускает уборку мусора – уничтожение неиспользуемых объектов. Об этом ниже.

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

6
Задача
Java Syntax Pro, 6 уровень, 1 лекция
Недоступна
Создаем массивы
В методе main проинициализируй переменные intArray и doubleArray массивами соответствующих типов, размер которых равен 10.
6
Задача
Java Syntax Pro, 6 уровень, 1 лекция
Недоступна
Четные и нечетные ячейки массива
В методе main(String[]) тебе нужно заполнить массив strings значениями. Если индекс массива чётный - присвоить значение "Чётный"(ноль - цифра чётная), иначе присвоить "Нечётный". Вывод текста в консоль в тестировании не участвует.
6
Задача
Java Syntax Pro, 6 уровень, 1 лекция
Недоступна
Работаем с элементами массива
Реализуй метод main(String[]), который меняет знак элемента массива array на противоположный, если значение этого элемента чётное.
Комментарии (156)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
AMIGO_2022_11_09 Уровень 17
16 ноября 2022
"Каждый объект после создания существует (живёт) пока хотя бы одна переменная хранит его адрес (на него есть хотя бы одна ссылка)", так и у людей, в жизни.
Grock Уровень 44
4 августа 2022
Сначала не понял этот отрывок: "Объект «кот Семми» после создания хранится в переменной cat1. Или, если быть точным, там хранится ссылка на него. Парой строчек ниже эта ссылка копируется в cat2. После этого в cat1 сохраняется ссылка на другой объект, и ссылка на «кот Семми» остаётся только в cat2. " Его можно прочитать так, что в результате копирования ссылки на "Сэмми" в cat2 cat1 начинает ссылаться на другой объект. Было бы понятнее, если бы в вышеназванной цитате было указано, что после копирования ссылки на "Сэмми" в cat2 и cat2 и cat1 ссылаются на один и тот же объект - "Сэмми". Но далее в строке 16 cat1 присваивается другой объект - "Ginger", после чего cat1 перестает ссылаться на "Сэмми" , который становится "мусором".
Anonymous #2768363 Уровень 19
25 марта 2022
Если у нас cat2 =cat1, то получается запись cat2 =null означает, что удаляется ссылка cat1 или удаляется сразу сам объект?
BucketOnHead Уровень 51 Expert
11 апреля 2022
При cat2 = null, удалится ссылка (Точно такая же как у cat1), и если у объекта не останется других ссылок, то и сам объект прекратить существование
Andrei Уровень 7
2 ноября 2021
Чтобы лучше понимать, попробуйте рисовать на бумаге переменные и как они ссылаются на объекты.
Максим Уровень 22 Expert
19 августа 2023
А лучше всего впридачу смотреть Трегулова,он часто обьясняет темы с помощью рисунка
Anonymous #2527749 Уровень 28
9 августа 2021
"Но если создать объект Cat в каком-нибудь методе и сохранить ссылку на него в переменную класса, то объект Cat будет существовать все время, пока существует ссылка на него из другого живого объекта." А можно пример сказанному?
Nick Уровень 20
10 апреля 2021
Опасная статья однако - может грозить автору за эту статью за жестокое обращение с котиками. 😾
Владоs Уровень 30
3 марта 2021
ясно ему
Lena Уровень 24
4 января 2021
На картинке нарисовано немного не так время жизни Sammy и Ginger. В конце Sammy находится только в cat2, и cat2 присвают null После этого Sammy должен пометится как объект для удаления В это время Ginger еще не помечен как "мусор" и теоретически есть вероятность что сборщик мусора соберет Sammy перед Ginger. В картинке же нарисовано так, как будто Sammy уничтожится точно не раньше Ginger
Сергей Уровень 5
29 декабря 2020
" Обычно объект уничтожается не сразу. Java-машина время от времени запускает уборку мусора – уничтожение неиспользуемых объектов. " - Вопрос к знатокам! А как вызвать Java-машину принудительно, что бы не ждать, когда она сама заработает?
Даниил Уровень 8
10 апреля 2021
В джаве нет такой механики как манипуляция с памятью, т.е. нельзя принудительно вызвать Garbage Collector(сборщик мусора) и сказать ему императивно что бы он уничтожил какой либо объект. https://vk.com/@javatutorial-upravlenie-pamyatu-java . В этой статье досконально показано как и что и как работает.
Даниил Уровень 8
10 апреля 2021
есть конечно такая штука как finalize(), но на практике она нигде не используется
Виктор Уровень 1
28 марта 2022
С штукой finalize() тоже не все, как оказалось просто. Вроде как её не рекомендуется вызывать самостоятельно. Для запроса сборщика мусора вы можете вызвать один из следующих методов (подробнее здесь):

System.gc()
Runtime.getRuntime().gc()
Судя по всему правильным решением является обнуление ссылки на объект.
Perl Developer Уровень 1
15 января 2023
Для это вам придётся начать программировать на C++ )))
Oleg Уровень 7
27 декабря 2020
Да, автор лекции - кудесник, рассказывающий простые вещи наиболее сложным способом