У меня есть некоторые проблемы со следующим примером (точнее, с одной конкретной строкой). Вот код (вопрос следует после):
public class Up
{
public void cc(Up u) {System.out.println("A");}
public void cc(Middle m) {System.out.println("B");}
}
public class Middle extends Up
{
public void cc(Up u) {System.out.println("C");}
public void cc(Down d) {System.out.println("D");}
}
public class Down extends Middle
{
public void cc(Up u) {System.out.println("E");}
public void cc(Middle m) {System.out.println("F");}
}
public class Test
{
public static void main(String... args)
{
Up uu = new Up();
Up pp = new Middle();
Down dd = new Down();
uu.cc(pp); // "A"
uu.cc(dd); // "B"
pp.cc(pp); // "C"
pp.cc(dd); // "B"
dd.cc(pp); // "E"
dd.cc(dd); // "D"
}
}
Теперь uu.cc(pp);
и uu.cc(dd);
довольно очевидны, потому что uu является экземпляром Up
, а pp
"выглядит как" Up
также (во время компиляции). Наиболее подходящим методом для dd
является cc(Middle m)
, поскольку dd
является экземпляром Down
, который наследуется от Middle
.
Линии, с которыми у меня больше всего проблем, это pp.cc(dd);
и dd.cc(dd)
.
Я действительно немного озадачен тем, какой метод выбран, когда и как эти вещи определяются при компиляции или во время выполнения.
Я был бы рад, если бы кто-то мог помочь мне понять.