Репост из: Java Interview Review
Что будет со ссылкой на метод, если заменить объект-владельца?
Ответ на этот вопрос будет очевиден, если вы уверенно понимаете, что скрывается за терминами ссылки вообще и ссылки на метод.
Для нестатических методов работает позднее связывание. По этой причине, когда мы обращаемся к такому методу по ссылке, то получаем метод экземпляра, а не типа переменной. На примере с изображения ниже метод класса A не будет затронут.
Факт позднего связывания в этом вопросе может ввести в заблуждение. Связывание случается в момент обращения, а не вызова. В результате в переменной хранится неизменяемая копия ссылки на метод. Она ведет на метод объекта, а не хранящей его переменной. Поэтому переприсвоение переменной позже не окажет на ссылку никакого эффекта.
Для достижения реального связывания в момент вызова в байткоде существует инструкция invokedynamic. Однако гораздо проще добиться того же результата, если использовать поведенческий паттерн ООП, например, посетителя.
#Язык
Ответ на этот вопрос будет очевиден, если вы уверенно понимаете, что скрывается за терминами ссылки вообще и ссылки на метод.
Для нестатических методов работает позднее связывание. По этой причине, когда мы обращаемся к такому методу по ссылке, то получаем метод экземпляра, а не типа переменной. На примере с изображения ниже метод класса A не будет затронут.
Факт позднего связывания в этом вопросе может ввести в заблуждение. Связывание случается в момент обращения, а не вызова. В результате в переменной хранится неизменяемая копия ссылки на метод. Она ведет на метод объекта, а не хранящей его переменной. Поэтому переприсвоение переменной позже не окажет на ссылку никакого эффекта.
Для достижения реального связывания в момент вызова в байткоде существует инструкция invokedynamic. Однако гораздо проще добиться того же результата, если использовать поведенческий паттерн ООП, например, посетителя.
#Язык