Это чаще называют динамическим связыванием.Он обеспечивает полиморфное поведение (полиморфизм является концепцией ООП).
В Java динамическое связывание выполняется на основе фактического типа объекта.Это означает, что независимо от объявленного типа объекта, тело вызванного метода будет тем, которое было объявлено в классе, который использовался для его создания (класс времени выполнения).Это класс, с которым был использован new
.
Когда вы присваиваете r = a
и вызываете r.callme()
, Java (во время выполнения) увидит, что класс объекта это переменная r
указывает на A
и, следовательно, будет запускать реализацию callme()
, предоставляемую классом A
.Аналогично, когда вы переназначаете r = b
и вызываете r.callme()
, Java увидит, что класс объекта равен B
, и запустит B.callme
.
Что касается части «почему», то Учебное пособие по Java имеет состояния:
В словарном определении полиморфизма упоминается принцип в биологии, в котором организм или вид могут иметь множество различных форм или стадий.Этот принцип также может быть применен к объектно-ориентированному программированию и таким языкам, как язык Java. Подклассы класса могут определять свое собственное уникальное поведение и, тем не менее, совместно использовать некоторые из тех же функций родительского класса.