Переопределение и перегрузка в 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:

Добавить комментарий