Удаление переменных из памяти

Рейтинг: -1Ответов: 1Опубликовано: 16.08.2023

У меня есть две переменные. Одна ссылочная, и вторая примитив. Они обе обернуты в поле видимости. И вопрос такой: "Когда этот блок заканчивается, то переменные и значения находящиеся в них уничтожаются (ссылка больше не встречается ни где)?"

public class Test {
    public static void main() {
        {
            String str = "apple";
            System.out.println(str);  //apple
            int num = 1;
            System.out.println(num);  //1
        }

        {
            String str = "tomato";
            System.out.println(str);  //tomato
            int num = 38;
            System.out.println(num);  //38
        }
    }
}

То есть на момент вывода "tomato" в памяти будет только "tomato" и 38 или все 4 значения?

Ответы

▲ 1Принят

Небольшое замечание

Не относится к вопроосу, но скажу, что при попытке запустить класс Test у вас появиться ошибка:

Error: Main method not found in class Test, please define the main method as:
   public static void main(String[] args)
or a JavaFX application class must extend javafx.application.Application

Так как вы забыли добавить String[] args в параметры метода main.

Ваш вопрос

Переменные в каком либо блоке (методе, инициализаторе, конструкторе, цикле и т.д.) - локальные переменные за пределами этого самого блока не видны. И если блок выполнился, то все эти переменные уничтожаются, как верно заметил @XelaNimed в комментарии. Ведь их всё равно ниоткуда не достать, то есть ссылок на них быть не может.

Доказательство:

  • За пределами блока видимости к переменной получить доступ нельзя. То есть ссылки на неё удалены:
public class Test {

    public static void main(String[] args) {
        {
            String str = "apple";
            System.out.println(str);  
        }
        System.out.println(str); //Ошибка: cannot find symbol
    }
}

Но что же будет, если блок, где объявляется переменная будет запущен ещё раз?
Давайте подробно посмотрим на происходящее:

  1. Блок запускается в первый раз.
  2. Блок завершает свою работу. Все переменные и ссылки на них удаляются.
  3. Блок запускается ещё раз.
  4. Переменные создаются заново. Ведь старых переменных как бы не существует, они и ссылки на них уже удалены.