Хм. Как насчет примера. Вы пишете алгоритм быстрой сортировки на языке C. Пользователь, который хочет использовать ваш алгоритм, должен предоставить метод сравнения, соответствующий тому, что пользователь сортирует по вашему алгоритму. Пользователь должен передать указатель функции на метод сравнения пользователя в свой код быстрой сортировки. Код быстрой сортировки использует этот адрес, указатель функции, для ВЫЗОВА НАЗАД на функцию сравнения пользователя. Вы предоставляете прототип функции, а не реализацию, так как вы не можете знать, как определить порядок сортировки. Пользователь предоставляет реализацию сравнения, которая имеет смысл для того, что пользователь сортирует. Эта реализация должна соответствовать прототипу функции. Указатель на функцию используется алгоритмом быстрой сортировки для возврата назад и прикосновения к коду пользователя.
Это на самом деле о полиморфизме.
В Java вы можете использовать интерфейс для этого. Так что для сортировки смотрите интерфейс IComparer и IComparable.