Переопределение и перегрузка в Java
Переопределение (overriding) и перегрузка (overloading) – одни из ключевых понятий в программировании на Java. Эти механизмы позволяют реализовать полиморфизм в программах Java. Полиморфизм — одна из концепций ООП.
На этом скриншоте показано, где в коде Java происходит перегрузка, а где – переопределение.
Переопределением называют случаи, когда сигнатура метода (имя и параметры) в суперклассе и дочернем классе совпадают. Когда два или более метода в одном классе имеют одинаковое имя, но разные параметры, это называется перегрузкой.
Перегрузка и переопределение: сравнительный анализ
Переопределение | Перегрузка |
Реализует «полиморфизм времени выполнения» | Реализует «полиморфизм времени компиляции» |
Вызов метода определяется во время выполнения на основе типа объекта. | Вызов метода определяется во время компиляции |
Происходит между суперклассом и подклассом | Происходит между методами в рамках одного класса |
Одинаковая сигнатура (имя и аргументы метода) | Одинаковое имя, но разные параметры |
В случае возникновения ошибки эффект будет виден во время выполнения | Ошибка может быть обнаружена во время компиляции. |
Переопределение и перегрузка: примеры
Давайте рассмотрим следующие примеры, чтобы понять, как работает переопределение и перегрузка в программах Java. За основу возьмем такой код:
package com.journaldev.examples; import java.util.Arrays; public class Processor { public void process(int i, int j) { System.out.printf("Processing two integers:%d, %d", i, j); } public void process(int[] ints) { System.out.println("Adding integer array:" + Arrays.toString(ints)); } public void process(Object[] objs) { System.out.println("Adding integer array:" + Arrays.toString(objs)); } } class MathProcessor extends Processor { @Override public void process(int i, int j) { System.out.println("Sum of integers is " + (i + j)); } @Override public void process(int[] ints) { int sum = 0; for (int i : ints) { sum += i; } System.out.println("Sum of integer array elements is " + sum); } }
Переопределение
Метод process() и параметры int i, int j в Processor переопределяются дочерним классом MathProcessor. Обратите внимание на строки 7 и 23:
public class Processor { public void process(int i, int j) { /* ... */ } } /* ... */ class MathProcessor extends Processor { @Override public void process(int i, int j) { /* ... */ } }
Метод process() и int[] ints в Processor также переопределяются в дочернем классе. Смотрите строки 11 и 28.
public class Processor { public void process(int[] ints) { /* ... */ } } /* ... */ class MathProcessor extends Processor { @Override public void process(Object[] objs) { /* ... */ } }
Перегрузка
Метод process() перегружается в классе Processor. Об этом говорят строки 7, 11 и 15:
public class Processor { public void process(int i, int j) { /* ... */ } public void process(int[] ints) { /* ... */ } public void process(Object[] objs) { /* ... */ } } Итоги
В этом руководстве мы на простом примере рассмотрели переопределение и перегрузку в Java. Переопределение происходит, когда сигнатура метода в суперклассе и дочернем классе одинакова. Перегрузка возникает, когда два или более метода в одном классе имеют одинаковое имя, но разные параметры.
Tags: Java