У меня есть вопрос о полиморфизме Java - PullRequest
1 голос
/ 20 апреля 2019

Почему конечный вывод "WuffRingding" вместо "RingdingRingding"?

package ubung;


 class Hund{
    public Hund(){
    }

    public String bellen(){
        return "Wuff";
    }

    public String spielen(Hund h){
        return "Wuff" + h.bellen();
    }


}

class Fuchs extends Hund{

    public Fuchs(){

    }

    public String bellen(){
        return "Ringding";
    }

    public String spielen(Fuchs f){
        return "Ringding"+ f.bellen();
    }

}



public class park {

    public static void main(String[] args){
        Hund bello = new Hund();
        Fuchs foxi = new Fuchs();
        Hund hybrid = new Fuchs();

        System.out.println(hybrid.spielen(foxi));


    }
}

Почему конечный вывод "WuffRingding" вместо "RingdingRingding"? Почему конечный вывод «WuffRingding» вместо «RingdingRingding»?

1 Ответ

1 голос
/ 20 апреля 2019

Выходное значение равно WuffRingding, поскольку метод public String spielen(Hund h) равен перегружен в дочернем классе Fuchs до public String spielen(Fuchs f).Java вызывает метод типа, а не фактического экземпляра, когда метод перегружен.

Таким образом, здесь используется тип Hund для переменной hybrid, и поскольку вызываемый метод определяется навремя компиляции перегруженных методов. Перегруженный метод класса Hund вызывается, хотя он указывает на экземпляр Fuchs.

Теперь вы указали экземпляр Fuchs в качестве параметра для spielen(Hund h)который явно принимает тип Hund в качестве параметра, это работает, так как Hund является родителем Fuchs и может содержать ссылку Fuchs, что в сочетании с динамическим полиморфизмом во время выполнения / bellen метода Fuchsкласс вызывается вместо Hund, так как во время выполнения проверяется тип экземпляра, и он фактически указывает на экземпляр Fuchs.

TLDR;

  • Вызывается spielen для ссылки Hund, вызывает spielen класса Hund при его перегрузке.
  • Передал экземпляр Fuchs, поэтому во время выполнения метод bellenFuchs это вызовредактируется вместо Hund из-за динамического метода диспетчеризации / полиморфизма времени выполнения .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...