Ни:
Перегрузка - это когда у вас одно и то же имя функции, которое принимает разные параметры.
Переопределение - это когда дочерний класс заменяет метод родителя своим собственным (это само по себе не означает полиморфизм).
Полиморфизм позднего связывания, например, методы базового класса (родительского) вызываются, но только во время выполнения приложение узнает, что представляет собой фактический объект - это может быть дочерний класс, методы которого отличаются. Это связано с тем, что любой дочерний класс может использоваться там, где определен базовый класс.
В Java вы часто видите полиморфизм с библиотекой коллекций:
int countStuff(List stuff) {
return stuff.size();
}
Список - это базовый класс, компилятор не имеет ни малейшего представления, если вы подсчитываете связанный список, вектор, массив или пользовательскую реализацию списка, если он действует как список:
List myStuff = new MyTotallyAwesomeList();
int result = countStuff(myStuff);
Если бы вы были перегружены, вы бы получили:
int countStuff(LinkedList stuff) {...}
int countStuff(ArrayList stuff) {...}
int countStuff(MyTotallyAwesomeList stuff) {...}
etc...
и правильная версия countStuff () будет выбрана компилятором для соответствия параметрам.