Переопределение против Перегрузки в Java

Введение

Переопределение и перегрузка – основные концепции в программировании на Java. Это способы реализации полиморфизма в наших программах на Java. Полиморфизм является одним из концепций ООП.

Screenshot of Java code with arrows pointing at instances where overloading and overriding are occurring.

Когда сигнатура метода (имя и параметры) совпадают в суперклассе и подклассе, это называется переопределением. Когда два или более метода в одном классе имеют одно и то же имя, но разные параметры, это называется перегрузкой.

Сравнение переопределения и перегрузки

Overriding Overloading
Implements “runtime polymorphism” Implements “compile time polymorphism”
The method call is determined at runtime based on the object type The method call is determined at compile time
Occurs between superclass and subclass Occurs between the methods in the same class
Have the same signature (name and method arguments) Have the same name, but the parameters are different
On error, the effect will be visible at runtime On error, it can be caught at compile time

Пример переопределения и перегрузки

Вот пример перегрузки и переопределения в программе на 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) { /* ... */ }

}

Вывод

{
“error”: “Upstream error…”
}

Source:
https://www.digitalocean.com/community/tutorials/overriding-vs-overloading-in-java