Top.Mail.Ru

Перечень уроков по Java

25. Перегрузка и переопределение методов

 Перегрузка  методов (overload)

Чтобы избежать дублирования методов, Java позволяет  определять несколько методов с одним и тем же именем. Например, удобно, чтобы методы, которые реализуют похожий алгоритм для различных типов данных, или разного их количества имели одно и то же имя. Например:

int max(int x, int y)
int max(int x, int y, int z)
float max(float x, float y)
float max(float x, float y, float z).


При компиляции программы при обращении к методу max() в зависимости от типа и количества фактических параметров будет вызван требуемый метод.

Например,

для   max(1, 2) будет вызван метод max(int x, int y),
для   max(1.0, 2.0) будет вызван метод max(float x, float y).

 

Предоставление компилятору возможности выбора среди нескольких методов необходимого называется перегрузкой (overload). В процессе такого выбора используется понятие сигнатуры метода. В Java сигнатура метода состоит из имени метода, типа, числа и последовательности формальных параметров метода.

Имена параметров, тип возвращаемого значения, модификаторы доступа в сигнатуру не входят, например методы

publicl void draw( int x, int y)
public int draw( int color, int bkcolor)
abstract void draw (int a, int b)

 

имеют одинаковую сигнатуру, поскольку сигнатуру составляют: имя метода - draw, тип, число параметров и их последовательность - (int, int):

draw (int, int)
draw (int, int)
draw (int, int).

 

Таким образом:

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

 

Переопределение методов (override)

Переопределение – это изменение реализации  уже существующего  в суперклассе метода (override).  В новом методе должны быть те же сигнатура и тип возвращаемого результата, что и у метода родительского класса.

Пример.

Имеем родительский класс A, в нем определен метод message(). В подклассе В родительский метод  переопределен.

public class A {

     public void message() {

     System.out.println("Класс A");

   }

   }

public class B  extends A {

     @Override  // Аннотация

  public void message() {

  System.out.println("Класс В");

}

}

  public static void main(String[] args) {

      A a = new A();

      a.message();   // Выводит "Класс А"

      B b = new B(); // Полиморфизм

      b.message();   // Выводит "Класс В"

    }

Будет выведено:
Класс A
Класс В

 

Запись   @Override  называется аннотацией  и указывает, что метод базового класса  должен быть переопределен. Если в базовом классе не окажется метода с аналогичной сигнатурой, то мы получим предупреждение компилятора о том, что метод  переопределить невозможно.  Аннотация не влияет на  переопределение метода,  но служит лишь для контроля успешности переопределения. Аннотацию можно удалить, но этого делать не надо, потому что в случае ошибки вместо переопределения будет выполнена перегрузка метода.

Таким образом:

  • при перезагрузке методы должны иметь разные сигнатуры
  • при переопределении методы  должны иметь одинаковые  сигнатуры
  • переопределяться могут только наследованные методы, т.е.
    полиморфизм применим только к переопределению, но не к перезагрузке.
  • методы могут быть перегружены и переопределены.
  • конструкторы могут быть  только перегружены.