Это один из способов реализации полиморфизма в Java.Это называется динамическим связыванием.
Реализация, которая выполняется во время выполнения, определяется путем просмотра фактического класса объекта, для которого вызывается метод.
В вашем случае, когда выобъявите A b = new B();
, а затем вызовите b.bookmark()
, Java сначала смотрит на среду выполнения, фактический тип объекта (B
- это тип среды выполнения, поскольку объект был создан с new B()
), независимо от его статического или объявленного типа (т.е. независимо от объявленного типа переменной, указывающей на объект).
Когда Java видит, что метод был переопределен в классе времени выполнения (это относится к объекту b
в вашем примере),он выполняет эту реализацию.В противном случае, он идет вверх по иерархии классов, чтобы найти унаследованную реализацию, как вы заметили (это относится к объекту c
в вашем примере).
Обратите внимание:
- Это поведение только для методов экземпляра (не применяется к статическим методам или полям).Статические методы выбираются на основе объявленного / статического типа.
- Существует исключение (о котором я могу думать): когда вызов выполняется с
super.bookmark()
, тогда Java обязательно запустит реализацию суперкласса -это не сценарий в вашем примере.