22 июн. 2015 г.

Классы. Часть 3 - перегрузка методов.

Java разрешает определение внутри одного класса двух или более методов с одним именем, если только они содержат разные параметры.

В этом случае методы называют перегруженными, а процесс — перегрузкой (overloading) методов. Перегрузка методов — один из способов поддержки полиморфизма в Java.

На заметку! Не надо путать перегрузку методов с их переопределением (overriding). Переопределение мы рассмотрим когда будем изучать наследование.

При вызове перегруженного метода для определения нужной версии Java использует тип и/или количество аргументов метода. Следовательно, перегруженные методы должны различаться по типу и/или количеству их параметров. Хотя возвращаемые типы перегруженных методов могут быть различны, самого возвращаемого типа не достаточно для различения двух версий метода. Когда Java встречает вызов перегруженного метода, она просто выполняет ту его версию, параметры которой соответствуют аргументам, использованным в вызове.

Если помните, то в первой части посвященной классам, мы использовали два разных метода, для задания размеров нашего ящика. Для обратной совместимости, мы сохраним эти методы, но так же создадим перегруженный метод setData(), который будет принимать разное количество параметров и разный их тип. N0005

Слева приведен отрывок из кода класса Box в текущей его инкарнации. В котором добавлен перегруженный метод setData(). У него есть три варианта, которые принимают один параметр типа double, три double и одну строку, соответственно. И каждый из них выполняет свой код и задает значения надлежащим полям.

Как уже говорилось чтобы Java различала какой метод надо использовать они должны отличаться по типу и/или количеству передаваемых в метод аргументов.

Пример использования этих методов приведен ниже:

 

N0006Как видно из примера слева, одно и тоже название метода используется по разному. Передаются разные по типу данных аргументы и разное их количество.

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

N0007

Стоит еще заметить что в данном случае происходит неявное преобразование типов данных, так как мы задаем размеры целочисленным литералом, а метод принимает double.

Перегрузка методов это полиморфизм, поскольку это один из способов реализации концепции "один интерфейс, несколько методов". Приведенный пример демонстрирует этот принцип, но стоит еще рассмотреть методы возвращающие значения.

Тут мы говорили о том что методы могут возвращать значения. Значениями могут быть как примитивные типы, так и объекты. Но подробно мы это не рассматривали и не практиковались. В свете данной темы, мы рассмотрим это чуть подробнее и попрактикуемся. Верней просто попрактикуемся и из этой практики, надеюсь все станет понятно.

O001

O002

Я сразу привел код и вывод программы. В принципе здесь все очень просто.

 

У нас есть перегруженный метод multiplay(), который принимает разное количество аргументов разных типов, и так же возвращает разные типы.

Обратите внимание что в предпоследней строке кода происходит неявное преобразование типов из int в double.

1 комментарий: