Java. Урок 23. Перегрузка

Уроки для начинающих   29 января 2013  Автор статьи:  

В данной статье мы рассмотрим перегрузку функций. Для чего нужна перегрузка функций? Иногда, имеет смысл создать несколько методов, которые имеют одинаковые названия, но разный набор параметров. С такой постановкой вопроса мы уже сталкивались, когда создавали несколько конструкторов. Давайте создадим метод, который будет возвращать расстояние от центра координат до точки:

double distance(int x)//одномерный случай
{
return (double)Math.abs(x);
}
double distance(int x, int y)//двумерный
{
return Math.sqrt(x*x+y*y);
}

double distance(int x, int y, int z)//трехмерный
{
return Math.sqrt(x*x+y*y+z*z);
}

Все три функции занимаются одним и тем же, ищут расстояние от центра координат, поэтому в данном случае использование перегрузки вполне оправданно.
Когда можно использовать перегрузку? Когда сигнатура каждой функции будет уникальна. Сигнатура — это название функции, вместе с типом параметров и порядком их следования, например сигнатуры для предыдущего примера:

distance(int)
distance(int, int)
distance(int, int, int)

Почему в сигнатуру не входят тип возвращаемого значения и имена переменных? Потому что при вызове функции, компилятор должен знать какую функцию ему запустить, а имена переменных и тип возвращаемого значения никак не контролируются.
Таким образом попробуем написать функцию, которая получает файл с именем «1.txt». И мы хотим, чтобы пользователь мог указывать как полный путь до файла, так и только до папки:

import java.io.File;

public class Solution {

static File getFile(String pathToFile) {
return new File(pathToFile);
}

static File getFile(String pathToFolder) {
return new File(pathToFolder+"\\1.txt");
}

public static void main(String[] args) {
getFile("C:");
getFile("C://1.txt");
}
}


Как мы видим из примера, у нас есть два метода getFile, которые делают разные действия. Так как они имеют одинаковые сигнатуры, то компилятор ругается, но мы пока не будем обращать внимание на это. Теперь попробуем вызвать два этих метода и увидим, что вызов абсолютно идентичен и компилятор не может понять какую — функцию вызвать. Он же не знает, что мы заложили в разницу между этими функциями наличие или отсутствие имя файла. Для него это в обоих случаях строка.
Перегрузка мощный инструмент, который стоит использовать, но без особого усердствования.

  • Сергей

    При выполнении:
    getFile(«C:»);
    getFile(«C://1.txt»);
    оба раза вызовется первая реализация метода getFile.

    В чем суть?

    • В следующем уроке, пока стоило понять, что 2 метода с одинаковой сигнатурой перекрывают друг друга.

Научиться программировать

  • на Delphi

  • на Java

  • на C++