Наследование функции вызова в java

Я написал код вроде

class A {
    public String show (D obj) {
        return ("A and D");
    }
    public String show (A obj) {
        return ("A and A");
    }
}

class B extends A {
    public String show(B obj) {
        return ("B and B");
    }
    @Override
    public String show(A obj) {
        return ("B and A");
    }

}


class Solution {
    public static void main(String[] args) {  
        A ab = new B();
        B b = new B();
        System.out.println(ab.show(b));
    }  
}

Результат - B и A. Я не понимаю, почему это не B и B, поскольку b - объект B. Но если я изменю От A ab = новый B () до B ab = новый B () Результатом будут B и B. Почему это так?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
30
2

Ответы 2

Поскольку ab - это A, он вызывает виртуальный A.show, но поскольку ab на самом деле является B, фактический вызываемый метод является заменой B виртуального метода исходного A.

Компилятор Java использует статическую привязку к типам аргументов, передаваемых в качестве параметров. Это определяет, какой перегрузка вызывается в классе типа переменной, здесь A.

Статический тип ab - это A, поэтому единственный подходящий метод с именем show - это show(A).

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

Тип среды выполнения ab - B. В show(A) есть переопределение B, поэтому это вызываемый метод, который печатает «B и A».

Другие вопросы по теме