Вопрос №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;
}
}
Объясните пож-ста пошаговую работу этого кода.
За всей мишурой важно разглядеть, что создаётся неизменяемый объект d2 класса Dot, для которого сетится значение поля size, равное 5, а затем происходит попытка присвоить этому полю значение 7, что не прокатывает в виду неизменяемости этого объекта. Вроде бы так.
После обнаружения точки входа main на хипе создаётся новый экземпляр класса Dot с нулевыми значениями d и size, на который указывает ссылка dDot в стеке метода main.
Далее в стеке создаётся неизменная ссылка d2 (однако сам объект может изменяться), которая пока никуда не ведёт.
Ей присваивается значение, возвращаемое методом setDot, вызываемым у экземпляра класса Dot по ссылке dDot, котоая также передаётся методу в качестве параметра.
Далее на стеке создаётся новый фрейм для метода setDot в котором будет храниться ссылка d3. В поле size на хипе записывается значение 5.
В следующей строчке создаётся экземпляр класса Dot, которому присваивается ссылка d и метод возвращает d3. Управление переходит к прошлому методу.
В поле size, созданного ранее на хипе экземпляра с ссылкой d записывается значение 7.
На экран выводится значение size на хипе со ссылкой d2 (5).
Возможно поможет кому-то понять, как это работает.
`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().
}
}`
Используйте Хекслет по максимуму!
- Задавайте вопросы по уроку
- Проверяйте знания в квизах
- Проходите практику прямо в браузере
- Отслеживайте свой прогресс
Зарегистрируйтесь или войдите в свой аккаунт
С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.







