Что будет со ссылкой на метод, если заменить объект-владельца?
Чтобы ответить на данный вопрос требуется знать, что такое ссылки и что такое ссылки на метод.
Если метод обычный, не статический, то для него применяется позднее связывание. При обращении к данному методу по указанной ссылке мы получаем нужный метод. В примере, приведённом ниже, метод, определённый в классе А не используется.
Чтобы не запутаться в связывании, следует помнить, что позднее связывание происходит в момент обращения к требуемому методу, а не вызова. Поэтому, в переменной находится постоянная копия ссылки на функцию. Она указывает на функцию. А значит переписывание переменной не повлияет на ссылку.
Чтобы добиться реального связывания можно воспользоваться инструкцией invokedynamc, но проще применить поведенческий паттерн объектно-ориентированного программирования, такой как «Посетитель».
class A {
void printMe() { System.out.println("A"); }
}
class В extends A {
@Override void printMe() { System.out.println("B"); }
}
class C extends В {
@Override void printMe() { System.out.println("C"); }
}
A target = new B();
Runnable methodReference = target::printMe;
target = new C();
// methodReference не сохраняет связь с обновлённый target
methodReference.run (); // напечатает "В"
Peer-to-peer собеседования
AI Sprints — обучение профессиям с ИИ
Практика собеседований с менторами и другими студентами. Реальные вопросы по Kotlin, Android и Backend
- Живые собеседования: практикуйте интервью с менторами и коллегами-студентами
- Реальные вопросы: база вопросов по Kotlin, Android, Backend и QA
- Фидбек: обратная связь после каждого собеседования — знаете, что улучшить
AI Challenge — собери чат-бота за 5 дней
Бесплатный марафон по AI-инжинирингу. Cursor + OpenAI, 60 минут в день — без опыта в программировании. К пятнице у вас будет рабочий чат-бот с памятью в браузере.
- Практика с первого дня, без теории «в стол»
- Готовый проект в портфолио к концу недели
- Старт в любой день — учитесь в своём темпе