Java Dynami c привязка при использовании наследования - PullRequest
0 голосов
/ 03 февраля 2020

Для следующего кода:

class A { 
    public void ex(Object o) {
        System.out.println("A");
    }
}

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

class C extends B {
    public void ex(A o) {
        System.out.println("C");
    }
}

public class Main {
    public static void main(String argv[]) {
        C xx;
        xx = new C();
        xx.ex(xx); // This prints B
    }
}

Почему результат вызова ex метода "B"? И тип ссылки, и класс: C, но выполняемый метод тот же, что и у суперкласса.

1 Ответ

2 голосов
/ 03 февраля 2020

Из-за созданной цепочки классов C экземпляры будут иметь все 3 доступных метода:

  • A.ex (Object)
  • B.ex (B)
  • C .ex (A)

Все они могут быть использованы для вашего xx.ex(xx) вызова. На этом этапе, согласно Java spe c, вызывается наиболее конкретный метод c.

Если более одного метода-члена доступны и применимы к вызову метода, необходимо выбрать один, чтобы предоставить дескриптор для отправки метода во время выполнения. В языке программирования Java используется правило, согласно которому выбирается наиболее конкретный метод c.

Поскольку у вас нет метода ex(C), наиболее конкретный метод c, который соответствует Ваш вызов B.ex(B), так как B является подклассом A, который является подклассом Object.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...