вызов функции наследования в Java - PullRequest
0 голосов
/ 05 мая 2018

Я написал код как

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. Почему это

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

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

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

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

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

0 голосов
/ 05 мая 2018

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

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