При перегрузке(overloading) методов решение о том какой именно метод будет вызван принимается на этапе компиляции, в отличие от полиморфизма когда это делается в процессе выполнения.
1: А теперь рассмотрим OverloadTest.foo(a). Компилятор не знает на какой именно объект типа A будет ссылаться переменная 'a', компилятор только знает тип переменной 'a', а именно A. Исходя из типа переменной компилятор принимает решение вызвать метод foo(A a).
2: OverloadTest.foo((I) a). В этом случае компилятор получает явное указание, что аргумент имеет тип I, следовательно будет вызван foo(I i).
Отдельный случай это когда аргумент указан как null, т.е. OverloadTest.foo(null). В этом случае будет вызван метод с аргументом имеющим тип наиболее высокий в иерархии, т.е. в данном случае foo(B b).
Войдите чтобы поставить Нравится
Войдите чтобы прокомментировать