ссылка на задачу - https://javarush.com/tasks/com.javarush.task.task20.task2023
начал играться с модификаторами доступа!
и доигрался до того. что не могу понять почему получаю следующий результат!
исходный код здесь.
результат такой:
C class, method2
A class, method2
A class, method1
C class, method2
если в классе А у метода 2 меняю модификатор доступа с pablic на private
получаю следующий результат:
A class, method2
A class, method1
как я понимаю -
A a = new C(); // в объект а помешаем объект С , позднее связывание.
a.method2(); // по моему пониманию, должен был вызвать(по логике позднего привязывания) метод2 объекта С (как в исходном коде, и запустить всю цыпочку вызовов)!
По факту запустился приватный метод класса А!?
почему?
Hardy
32 уровень
ковырял задачку task2023 для лучшего понимания раннего и позднего связывания .
Обсуждается
Комментарии (2)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Ksenia Volkova Java Developer в DXC Master
6 мая 2021, 09:44
Если метод приватный - значит, он не может быть переопределен. То есть method2() из класса C никак не связан с method2() из класса A.
Поскольку тип переменной у тебя - A, то вызывается метод из класса А.
И так как он в классе С не переопределен (и не может быть переопределен) - то он и срабатывает.
+1
Hardy
6 мая 2021, 13:34
ну тогда должен был сработать - B class, method2 он публичный !?
класс С наследует метод 2 от B.method2 !?
....
Я кажется понял!!
Вы хотите сказать, что по приватному методу у "дедушки A" нет наследников!
"параметр доступа Private нарушилась цепочка наследования по методу 2"
обрезая ее между А и Б
но есть цепочка наследования по методу 2 между "Родитель B " - "ребенком C"
А значит по этому методу2 теряются полиморфизм между А и Б ( это к первым двум строкам сообщениея.)
И при выполнении строки - a.method2();
приведенного объекта, запускается метод2 объекта а. Так как ему не к чкчему больше привязаться. Точнее он только к нему и привязан так как нет полиморфной зависимости.
Так как у него нет наследника по этому методу!
И это раннее связывание, так как компилятор видит схему наследования!
0