Вопрос №666 от пользователя Михаил Соколовский в уроке «Модуль 5. Урок 3. Неизменяемые объекты.», курс «Введение в Java»

Михаил Соколовский

В этом задании также ничего не поменяется, если убрать атрибут final:

public class Dot {
    Dot d;
    int size;

    public static void main(String[] args) {
        Dot dDot = new Dot();
        final Dot d2;
        d2 = dDot.setDot(dDot);
        d2.d.size = 7;
        System.out.print(d2.size);
    }

    Dot setDot(Dot d3) {
        d3.size = 5;
        d3.d = new Dot();
        return d3;
    }

}
4 0

Alexandr Tabacari

Объясните пож-ста пошаговую работу этого кода.

0

Базыль Яськевіч

За всей мишурой важно разглядеть, что создаётся неизменяемый объект d2 класса Dot, для которого сетится значение поля size, равное 5, а затем происходит попытка присвоить этому полю значение 7, что не прокатывает в виду неизменяемости этого объекта. Вроде бы так.

0

Глеб Бочкарёв

После обнаружения точки входа main на хипе создаётся новый экземпляр класса Dot с нулевыми значениями d и size, на который указывает ссылка dDot в стеке метода main.
Далее в стеке создаётся неизменная ссылка d2 (однако сам объект может изменяться), которая пока никуда не ведёт. Ей присваивается значение, возвращаемое методом setDot, вызываемым у экземпляра класса Dot по ссылке dDot, котоая также передаётся методу в качестве параметра. Далее на стеке создаётся новый фрейм для метода setDot в котором будет храниться ссылка d3. В поле size на хипе записывается значение 5. В следующей строчке создаётся экземпляр класса Dot, которому присваивается ссылка d и метод возвращает d3. Управление переходит к прошлому методу.
В поле size, созданного ранее на хипе экземпляра с ссылкой d записывается значение 7. На экран выводится значение size на хипе со ссылкой d2 (5).

3

Ivan Al

Возможно поможет кому-то понять, как это работает.

`public class Dot { Dot d; int size;

public static void main(String[] args) {
    Dot dDot = new Dot();   // создаем новый экземпляр класса dDot
    final Dot d2;           // создаем ссылку d2
    d2 = dDot.setDot(dDot); // ссылке присваивается значение, возвращаемое методом setDot, вызываемым у экземпляра
                            // класса Dot по ссылке dDot, которая также передаётся методу в качестве параметра
    d2.d.size = 7;          // в поле size, созданного ранее на хипе экземпляра с ссылкой d записывается значение 7.
    System.out.print("\n d2.size  " + d2.size); // На экран выводится значение size на хипе со ссылкой d2 (5).
    System.out.print("\n d2.d.size  " + d2.d.size); 
}

Dot setDot(Dot d3) {    // На стеке создаётся новый фрейм для метода setDot в котором будет храниться ссылка d3
    d3.size = 5;        // В поле size на хипе записывается значение 5
    d3.d = new Dot();   // Создаётся экземпляр класса Dot, которому присваивается ссылка d
    System.out.print("\n d3.size  " + d3.size);
    return d3;          // Метод возвращает d3. Управление переходит к прошлому методу main().

}

}`

4

Используйте Хекслет по максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»

Рекомендуемые программы

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

Иконка программы Фронтенд-разработчик
Профессия
Разработка фронтенд-компонентов веб-приложений
25 мая 10 месяцев
Иконка программы Python-разработчик
Профессия
Разработка веб-приложений на Django
25 мая 10 месяцев
Иконка программы PHP-разработчик
Профессия
Разработка веб-приложений на Laravel
25 мая 10 месяцев
Иконка программы Node.js-разработчик
Профессия
Разработка бэкенд-компонентов веб-приложений
25 мая 10 месяцев
Иконка программы Fullstack-разработчик
Профессия
Новый
Разработка фронтенд и бэкенд компонентов веб-приложений
25 мая 16 месяцев
Иконка программы Верстальщик
Профессия
Вёрстка с использованием последних стандартов CSS
в любое время 5 месяцев
Иконка программы Java-разработчик
Профессия
Разработка приложений на языке Java
25 мая 10 месяцев
Иконка программы Разработчик на Ruby on Rails
Профессия
Создает веб-приложения со скоростью света
25 мая 5 месяцев