Чтобы ответить на данный вопрос требуется знать, что такое ссылки и что такое ссылки на метод.
Если метод обычный, не статический, то для него применяется позднее связывание. При обращении к данному методу по указанной ссылке мы получаем нужный метод. В примере, приведённом ниже, метод, определённый в классе А не используется.
Чтобы не запутаться в связывании, следует помнить, что позднее связывание происходит в момент обращения к требуемому методу, а не вызова. Поэтому, в переменной находится постоянная копия ссылки на функцию. Она указывает на функцию. А значит переписывание переменной не повлияет на ссылку.
Чтобы добиться реального связывания можно воспользоваться инструкцией 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 (); // напечатает "В"