Sobrescritura vs Sobrecarga en Java

Introducción

Sobrescritura y sobrecarga son conceptos fundamentales en la programación Java. Son las formas de implementar polimorfismo en nuestros programas Java. El polimorfismo es uno de los conceptos de OOPS.

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

Cuando la firma del método (nombre y parámetros) es la misma en la superclase y la clase hija, se llama sobrescritura. Cuando dos o más métodos en la misma clase tienen el mismo nombre pero diferentes parámetros, se llama sobrecarga.

Comparación entre sobrescritura y 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

Ejemplo de sobrescritura y sobrecarga

Aquí hay un ejemplo de sobrecarga y sobrescritura en un 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);
	}

}

Sobrescritura

El método process() y los parámetros int i, int j en Processor son sobreescritos en la clase hija MathProcessor. Línea 7 y línea 23:

public class Processor {

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

}

/* ... */

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

}

Y el método process() y int[] ints en Processor también son sobreescritos en la clase hija. Línea 11 y línea 28:

public class Processor {

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

}

/* ... */

class MathProcessor extends Processor {

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

}

Sobrecarga

El método process() está sobrecargado en la clase Processor. Líneas 7, 11 y 15:

public class Processor {

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

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

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

}

Conclusión

En este artículo, cubrimos la anulación y la sobrecarga en Java. La anulación ocurre cuando la firma del método es la misma en la superclase y la clase hija. La sobrecarga ocurre cuando dos o más métodos en la misma clase tienen el mismo nombre pero diferentes parámetros.

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