Решил задачу, но не совсем понимаю, почему изменением доступа на private обращение в первую очередь перешло к нему.
Mikhail Fufaev
35 уровень
Initialize()
Решен
Комментарии (11)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Антон НикольскийExpert
7 января 2018, 18:43решение
Порядок инициализации следующий:
1) Статические элементы
2) Глобальные переменные родителя
3) Конструктор родителя
4) Глобальные переменные наследника
5) Конструктор наследника
а) Ситуация до исправления модификатора.
При вызове new B(6) сначала происходит вызов конструктора класса А, а переменная f1 класса В еще не инициализировалась и равна 0. В конструкторе класса А происходит вызов метода initialize(). Поскольку этот метод может быть переопределен в классах-наследниках, то компилятор не привязывает вызов этого метода к initialize() класса А, а отдает этот вопрос на решение джава-машины. Джава-машина видит, что метод вызван из объекта класса В, и соответственно вызывает initialize() класса В. Однако переменная f1 класса В еще не успела инициализоваться (см. порядок инициализации), поэтому выводится 0.
б) Ситуация после исправления модификатора.
Все то же самое, но теперь компилятор считает, что приватный метод initialize() класса А переопределяться не будет. Поэтому он жестко привязывает вызов метода initialize() в конструкторе А к initialize() класса А еще ДО выполнения программы. И джава-машине ничего не остается как вызывать там метод initialize() именно класса А, а не класса В.
В интернете где-то есть по этому поводу информация, что в джаве (в отличие от С++) для приватных и финальных методов применяется раннее связывание (на уровне компилятора), а для "обычных" методов - позднее связывание (на уровне джава-машины).
+299
Mikhail Fufaev
9 января 2018, 01:19
Спасибо!
0
Илья Михайлов
10 апреля 2018, 19:15
Тебе бы преподавателем стать! Всё очень годно разжевал.
+10
hidden #2004242
5 февраля 2019, 13:54
Не до конца понял конечно... Но лучше чем вообще пустота. Буду думать где ставить этот модификатор дальше.
Хотя бы порядок инициализации уяснил.
0
Dmitriy
6 октября 2019, 08:18
Это одна из тех задач, которые решил благодаря самому условию, но сам нифига не понял. такое я сохраняю в отдельную папку для дальнейших разбирательств на работе, когда времени не жалко ))) и твое объяснение очень кстати. Спасибо!
+1
Гросу
25 октября 2019, 21:29
может прозвучать неособо умно, но static method (и как следствие - его тело) можно считать за "Статические элементы" ?
0
Asike
30 октября 2019, 07:19
спасибо за разъяснения. вроде и понял и не понял. Но задачу решил
0
Сиявуш Android Developer в Эсхата Банк. Таджики Expert
26 декабря 2019, 11:58
Спасибо большое! Очень помог!
0
SERGEY
25 февраля 2021, 16:41
Ответ может быть не верным, но вроде метод не инициализируется сам по себе. Ты можешь обратиться к нему как из статического блока, так и не статического. Его логика начинает работать при обращении к нему из любого объекта, который видит ссылку на этот метод. Его задача работать с полями и объектами. Статический метод отличается от не статического только тем, что для всех объектов класса он общий.
0
Виталий Работает в поте лица
2 октября 2021, 17:28
В отличие от других пояснений, это самое годное. Спасибо!
0
Виктор
28 апреля 2022, 11:38
Хорошо, а как обратиться тогда к initialize() класса А если у него стоит protected ? Можем ли мы сделать это не изменяя protected на private?
0