Хотя перегруженные методы имеют одно и то же имя в коде, метод с n
перегрузками будет иметь n
разных сигнатур методов.Эти методы могут принимать и возвращать различные параметры и возвращаемые значения.Компилятору необходимо знать, какую сигнатуру метода использовать, чтобы понять, допустим ли код его компиляции.
Рассмотрим следующий перегруженный метод:
class Translator {
String translate(int i) { return String.valueOf(i); }
int translate(String s) { return Integer.valueOf(s); }
}
Эти методы имеют одно и то же имя, но имеют очень разные подписи.Если вы выберете одно против другого, вы можете получить неверный исполняемый файл.
Переопределенные методы, с другой стороны, имеют одинаковую подпись.Поскольку они имеют одинаковые типы ввода и возвращаемые типы, можно выбирать реализацию во время выполнения, при этом обеспечивая безопасность времени компиляции.
Выбор перегруженного метода не приводит к снижению производительности.После времени компиляции стоимость вызова одного перегруженного метода по сравнению с другим равна стоимости вызова методов с отдельными именами.Вызов виртуального метода уже дорог, и добавление разрешения процесса в процесс только замедлит выполнение.