class OverloadDemo { public static void main(String args[]) { Overload ob = new Overload; int resl; double resD; // вызвать все варианты метода ovlDemo ob.ovlDemo; System.out.println; ob.ovlDemo(2) ; System.out.println; resl = ob.ovlDemo(4, 6) ; System.out.println("Result of ob.ovlDemo(4, 6): " + resl); System.out.println; resD = ob.ovlDemo(1.1, 2.32); System.out.println("Result of ob.ovlDemo(1.1, 2.32): " + resD); }

} Как видите, метод ovlDemo перегружается четырежды. В первом его варианте параметры не предусмотрены, во втором — определен один целочисленный параметр, в третьем — два целочисленных параметра, в четвертом — два параметра типа double. Обратите внимание на то, что первые два варианта метода ovlDemo имеют тип void, а два другие возвращают значение. Как пояснялось ранее, тип возвращаемого значения не учитывается при перегрузке методов. Следовательно, попытка определить два варианта метода ovlDemo так, как показано ниже, приводит к ошибке.

// Возможен лишь один вариант метода ovlDemo (int). // Возвращаемое значение нельзя использовать // для различения перегружаемых методов. void ovlDemo(int а) { System.out.println("One parameter: " + a); } / Ошибка! Два варианта метода ovlDemo(int) не могут существовать, даже если типы возвращаемых ими значений отличаются. / int ovlDemo(int а) { System.out.println("One parameter: " + a); return a * a; } Как поясняется в комментариях к приведенному выше фрагменту кода, отличия возвращаемых типов недостаточно для перегрузки методов. Как следует из главы 2, в Java производится автоматическое приведение типов. Это приведение распространяется и на типы параметров перегружаемых методов. В качестве примера рассмотрим следующий фрагмент кода:

/ Автоматическое преобразование типов может оказывать влияние на выбор перегружаемого метода. / class 0verload2 { void f(int x) { System.out.println("Inside f(int): " + x) ; } void f(double x) { System.out.println("Inside f(double): " + x) ; }

}

class TypeConv { public static void main(String args[]) { overload2 ob = new 0verload2; int i = 10; double d = 10.1; byte b = 99; short s = 10; float f = 11.5F; ob.f(i); // Вызов метода оb.f(int) ob.f(d); // Вызов метода ob.f(double) ob.f(b); // Вызов метода oh.f(int) с преобразованием типов ob.f(s); // Вызов метода ob.f(int) с преобразованием типов ob.f(f); // Вызов метода ob.f(double) с преобразованием типов }

} Выполнение этого фрагмента кода дает следующий результат:

Inside f (int) : 10 Inside f(double): 10.1 Inside f (int): 99 Inside f(int): 10 Inside f(double): 11.5 В данном примере определены только два варианта метода f : один принимает параметр типа int, а второй — параметр типа double. Но передать методу f можно также значение типа byte, short или float. Значения типа byte и short исполняющая система Java автоматически преобразует в тип int. В результате будет вызван вариант метода f (int). А если параметр имеет значение типа float, то оно преобразуется в тип double и далее вызывается вариант метода f (double). Важно понимать, что автоматическое преобразование типов выполняется лишь в отсутствие прямого соответствия типов параметра и аргумента. В качестве примера ниже представлена другая версия предыдущей программы, в которой добавлен вариант метода f с параметром типа byte.

// Добавление варианта метода f(byte). class 0verload2 { void f(byte x) { System.out.println("Inside f(byte): " + x) ; } void f(int x) { System.out.println("Inside f(int) : " + x); } void f(double x) { System.out.printlnpinside f(double): " + x); }

}

class TypeConv { public static void main(String args[]) { 0verload2 ob = new 0verload2; int i = 10; double d = 10.1; byte b = 99; short s = 10; float f = 11.5F; ob.f(i); // Вызов метода ob.f(int) ob.f(d); // Вызов метода ob.f(double) ob.f(b); // Вызов метода ob.f(byte) без преобразования типов ob.f(s) ; // Вызов метода ob.f (int) с преобразованием (типов ob.f(f) ; // Вызов метода ob.f(double) с преобразованием типов }

} Выполнение этой версии программы дает следующий результат:

Перейти на страницу:

Похожие книги