Я получил короткий вопрос о полиморфизме в java: вот две иерархии классов, и упражнение состоит в том, чтобы сказать, что код будет распечатывать.
class All { /* ... */ }
class Most extends All { /* ... */ }
class Special extends Most { /* ... */ }
class Top {
public void m( All p ) { System.out.print("A "); }
}
class Middle extends Top {
public void m( All p ) { System.out.print("M "); }
public void m( Special p ) { System.out.print("L "); }
}
class Bottom extends Middle {
public void m( Most p ) { System.out.print("V "); }
public void m( Special p ) { System.out.print("X "); }
}
class Test {
public static void main(String[] args) {
All all = new All();
Most most = new Most();
Special special = new Special();
Top x = new Middle();
Top y = new Bottom();
Middle z = new Bottom();
x.m( most );
x.m( special );
y.m( all );
y.m( special );
z.m( all );
z.m( most );
}
}
Я вставил код в файл Eclipse. java, и он распечатал 6x M, поэтому M для каждого метода. Может ли кто-нибудь помочь мне понять?
Очевидно, объявленный тип аргумента вызывающей ссылки и аргумент имеют значение и ничего больше (согласно сценарию), но в этом случае, почему x.m(special)
не распечатывает "L", так как Special - это тип аргумента метода?
PS: Мой самый первый вопрос по stackoverflow, очень надеюсь, что кто-нибудь может помочь мне понять:)