Java руководство для начинающих - Шилдт Герберт (2012)
-
Год:2012
-
Название:Java руководство для начинающих
-
Автор:
-
Жанр:
-
Оригинал:Английский
-
Язык:Русский
-
Издательство:Вильямс
-
Страниц:316
-
ISBN:978-5-8459-1770-6
-
Рейтинг:
-
Ваша оценка:
Java руководство для начинающих - Шилдт Герберт читать онлайн бесплатно полную версию книги
System.out.println("Two double parameters: " +
a + " "+ b);
return a + b;
}
}
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 {