Sobreposição vs Sobrecarga em Java

Introdução

Sobrescrita e sobrecarga são conceitos fundamentais na programação Java. Eles são formas de implementar polimorfismo em nossos programas Java. Polimorfismo é um dos Conceitos de OOPS.

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

Quando a assinatura do método (nome e parâmetros) é a mesma na superclasse e na classe filha, é chamado de sobrescrita. Quando dois ou mais métodos na mesma classe têm o mesmo nome, mas parâmetros diferentes, é chamado de sobrecarga.

Comparando sobrescrita e sobrecarga

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

Exemplo de sobrescrita e sobrecarga

Aqui está um exemplo de sobrecarga e sobrescrita em um programa 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);
	}

}

Sobrescrita

O método process() e os parâmetros int i, int j na classe Processor são sobrescritos na classe filha MathProcessor. Linha 7 e linha 23:

public class Processor {

    public void process(int i, int j) { /* ... */ }

}

/* ... */

class MathProcessor extends Processor {
 
    @Override
    public void process(int i, int j) {  /* ... */ }

}

E o método process() e int[] ints na classe Processor também são sobrescritos na classe filha. Linha 11 e linha 28:

public class Processor {

    public void process(int[] ints) { /* ... */ }

}

/* ... */

class MathProcessor extends Processor {

    @Override
    public void process(Object[] objs) { /* ... */ }

}

Sobrecarga

O método process() é sobrecarregado na classe Processor. Linhas 7, 11 e 15:

public class Processor {

    public void process(int i, int j) { /* ... */ }

    public void process(int[] ints) { /* ... */ }

    public void process(Object[] objs) { /* ... */ }

}

Conclusão

Neste artigo, abordamos a substituição e a sobrecarga em Java. A substituição ocorre quando a assinatura do método é a mesma na superclasse e na classe filha. A sobrecarga ocorre quando dois ou mais métodos na mesma classe têm o mesmo nome, mas parâmetros diferentes.

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