Почему JVM ищет метод от дочернего к родительскому в дереве наследования? - PullRequest
0 голосов
/ 22 сентября 2018

Вот пример кода, который я смотрю и хотел бы знать, почему JVM всегда ищет метод в дочернем классе, когда аналогичный метод присутствует в родительском и когда ссылка имеет тип parent, но объектимеет тип ребенка.

class A{
    public void saveLink(){
        System.out.println("A: saveLink");
        bookmark();
    }
    public void bookmark() {
        System.out.println("A: bookmark");
    }
}

class B extends A{
    public void bookmark(){
        System.out.println("B: bookmark");
    }
}

class C extends B{

}   

class Test {
    public static void main(String[] args) {
        A a = new A();
        A b = new B();
        A c = new C();

        c.saveLink();
    }
}

Когда я запускаю приведенный выше код, он выдает:

A: saveLink
B: bookmark

Может кто-нибудь объяснить, пожалуйста, подробнее об этом?

1 Ответ

0 голосов
/ 22 сентября 2018

Это один из способов реализации полиморфизма в Java.Это называется динамическим связыванием.

Реализация, которая выполняется во время выполнения, определяется путем просмотра фактического класса объекта, для которого вызывается метод.

В вашем случае, когда выобъявите A b = new B();, а затем вызовите b.bookmark(), Java сначала смотрит на среду выполнения, фактический тип объекта (B - это тип среды выполнения, поскольку объект был создан с new B()), независимо от его статического или объявленного типа (т.е. независимо от объявленного типа переменной, указывающей на объект).

Когда Java видит, что метод был переопределен в классе времени выполнения (это относится к объекту b в вашем примере),он выполняет эту реализацию.В противном случае, он идет вверх по иерархии классов, чтобы найти унаследованную реализацию, как вы заметили (это относится к объекту c в вашем примере).


Обратите внимание:

  • Это поведение только для методов экземпляра (не применяется к статическим методам или полям).Статические методы выбираются на основе объявленного / статического типа.
  • Существует исключение (о котором я могу думать): когда вызов выполняется с super.bookmark(), тогда Java обязательно запустит реализацию суперкласса -это не сценарий в вашем примере.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...