Вопрос №490 от пользователя Николай Артамонов в уроке «Модуль 5. Урок 2. Конструкторы в Java.», курс «Введение в Java»

Николай Артамонов

Кто то может объяснить пошагово как работает данный код из теста?

1 abstract class ConsoleView {

2 static String s = "-";

3 ConsoleView() {

4 s = s + "o";

5 }

6 }

7 public class MenuView extends ConsoleView {

8 MenuView() {

9 this(7);

10 s = s + "x";

11 }

12 MenuView(int i) {

13 s = s + "x2";

14 }

15 public static void main(String[] args) {

16 System.out.print("two " + s + " ");

17 }

18 static {

19 MenuView x = new MenuView();

20 System.out.print("one " + s + " ");

21 }

22 }

5 3

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

Этот вопрос из тестов мы убрали в силу его нетривиальности.

0

Николай Артамонов

не не не, давайте разберемся! )))

0

Николай Артамонов

Вот какие выводы сделал я :

1) Сначала выполняется "безымянный"" "static" (строка 18) -

MenuView x = new MenuView(); - чтобы создать экземпляр MenuView необходимо создать экземпляр его предка - ConsoleView.

В ConsoleView при обращении к нему создается поле static String s // s = "-" Запускается конструктор без параметров ConsoleView() (не конструктор по умолчанию) (строка 3) в котором изменяется значение s
// s ="-o"

После создания ConsoleView , создается непосредственно MenuView () (строка 8) - через конструктор без параметров (не конструктор по умолчанию), этот конструктор передает аргумент 7 (this(7);) в конструктор принимающий на вход число
MenuView (int i) (строка 12) - он в свою очередь изменяется значение s // s= "-ox2" и возвращает выполнение в конструктор MenuView () к следующей команде в этом конструкторе - s = s + "x"; (строка 10) и снова изменяем значение s // s="-ox2x"

2) Создав MenuView и изменив значение s, переходим к следующей команде System.out.print("one " + s + " "); - выводим на экран "one -ox2x".

3) После этого (?????? КАК ТАК ???) происходит выполнение команд из "точки входа ???" public static void main - System.out.print("two " + s + " "); - выводим на экран - "two -ox2x".

Очень надеюсь на правку неточностей в моих умозаключениях.

0

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

Итак, мы горе Ваше готовы разделить, но по пунктам:

  1. static зона, которая начинается в строчке 18 это часть кода, которая выполнится Java в момент, когда класс (к которому принадлежит эта static зона) будет загружен в оперативную память. Очень важно понять, что этот код будет выполнен только один раз и он совершенно не зависит от того сколько экземпляров этого класса будет создано.
  2. Итак, разберём то, что происходит в сточке 19, где создаётся экземпляр MenuView. Как можно заметить мы создаём новый экземпляр класса MenuView вызывая конструктор без входных аргументов (new MenuView();). Соответственно будет вызван конструктор в строчке 8. Далее Java проверит есть ли в первой строчке конструктора ключевое слово this или super. В данном конструкторе в строчке номер 9 стоит ключевое слово this(7). Соответственно Java вызовет конструктор MenuView, которому на вход можно передать число. Данным конструктором является конструктор в строчке 12. И вновь Java проверит есть ли в первой строчке конструктора ключевое слово this или super. Поскольку ни одного из этих ключевых слов нет, то Java добавит ключевое слово super (ссылку на конструктор родительского класса, который на вход не принимает аргументов). С этого момента выполнение программы перейдёт в конструктор родительского класса, а именно в строчку номер 3.
  3. К этому моменту все static поля класса уже должны быть проинициализированы. Соответственно переменная s на этот момент равна "-".
  4. Вот мы добрались до выполнения строки 4 в которой значение s станет равно "-o", после чего Java c чувством выполненного долга вернёт выполнение программы в строчку 13 в которой значение переменно s изменится на "-ox2".
  5. Теперь Java выполнив и этот конструктор вернёт выполнение программы в строчку 10 где изменится значение переменно s на "-ox2x".
  6. Как только Java героически закончила создание экземпляра класса в строчке 19, мы выводим на экран значение переменной s в строчке 20. И вот тут очень важно обратить внимание на то, что переменная s - static. Это означает, что существует только один экземпляр этой переменной и этот экземпляр будет существовать всё время существования виртуальной машины и Java не будет обнулять эту переменную.
  7. Всё что было описано в предыдущих трёх пунктах происходило в момент когда Java подгружала в оперативную память класс MenuView и ConsoleView. Именно в этот момент происходит выполнение всех static зон. После того как эта прелюдия закончена, Java наконец может начать выполнение программы и вызвать точку входа (main метод). Как думаю уже стало понятно, метод прочитает значение static переменной s, которое было установлено в момент подгрузки классов в оперативную память так называемым загрузчиком классов.
3

Николай Артамонов

Спасибо за ответ!

0

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

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

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

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

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

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

Иконка программы Фронтенд-разработчик
Профессия
Разработка фронтенд-компонентов веб-приложений
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 месяцев