Polimorfismo en Java: cómo sobrecargar o anular métodos

La sobrecarga y la anulación de métodos son las dos formas en que Java demuestra polimorfismo. El polimorfismo proviene de una combinación de dos palabras griegas: "poli" que significa muchos y "morph" que significa forma. Por tanto, el polimorfismo permite que los métodos adopten muchas formas.

Siga esta guía para aprender a sobrecargar o anular métodos en Java.

¿Qué es la sobrecarga de métodos?

"Sobrecarga de métodos" se refiere a definir diferentes métodos en una clase con el mismo nombre. Los métodos deben tener diferentes firmas. La firma de un método es la combinación del nombre de un método y la lista de parámetros. No incluye el tipo de devolución.

El compilador sabe qué método utilizar comprobando el tipo, el número de parámetros y el orden en que se colocan.

Relacionado: Exploración de la herencia en el lenguaje de programación Java

La sobrecarga de métodos demuestra polimorfismo en tiempo de compilación. El polimorfismo en tiempo de compilación significa que el compilador de Java vincula un objeto a su funcionalidad en tiempo de ejecución. El compilador comprueba las firmas de métodos para lograr esto.

Este tipo de polimorfismo también se conoce como unión estática o temprana.

Vea el ejemplo de sobrecarga de métodos a continuación:

 class Arithmetic{
int cube(int x){
return x*x*x;
}
double cube(double x){
return x*x*x;
}
float cube(float x){
return x*x*x;
}
public static void main(String[] args){
Arithmetic myMultiplication = new Arithmetic();
System.out.println("The cube of 5 is " + myMultiplication.cube(5));
System.out.println("The cube of 5.0 is " + myMultiplication.cube(5.0));
System.out.println("The cube of 0.5 is " + myMultiplication.cube(0.5));
}
}

Producción:

 The cube of 5 is 125
The cube of 5.0 is 125.0
The cube of 0.5 is 0.125

El código anterior muestra cómo puede obtener un cubo de diferentes tipos ( int , double , float ) usando el mismo método.

Generalmente, la sobrecarga de métodos se usa para definir métodos similares con diferentes tipos de parámetros.

¿Qué es el método anulado?

Esto se refiere a una implementación diferente de un método en una subclase. El método ya debe estar definido en la clase padre.

El método predominante (es decir, el de la subclase) debe tener la misma firma de método que el de la superclase. El tipo de retorno del método de reemplazo puede ser el mismo o un subtipo del de la superclase.

La anulación se usa generalmente para incluir una implementación específica del comportamiento de un objeto en la subclase.

 class Account{
public void message() {
System.out.println("
Thank you for opening an account with us!");
}
public static void main(String args[]) {
Account myAccount = new Account();
Savings mySavings = new Savings();
FixedDeposit myFixedDepo = new FixedDeposit();
myAccount.message();
mySavings.message();
myFixedDepo.message();
}
}
class Savings extends Account {
public void message() {
System.out.println("
Thank you for opening a Savings account with us!");
}
}
class FixedDeposit extends Account {
public void message() {
System.out.println("
Thank you for opening a Fixed Deposit account with us!");
}
}

Producción:

 Thank you for opening an account with us!
Thank you for opening a Savings account with us!
Thank you for opening a Fixed Deposit account with us!

El ejemplo anterior muestra cómo se reemplaza el método message () en las subclases Savings y FixedDeposit . Se mostrarán diferentes mensajes para los titulares de cuentas bancarias con una cuenta de ahorros y aquellos con una cuenta de depósito fijo.

Relacionado: Lo que necesita saber sobre el uso de cadenas en Java

También vale la pena señalar que la invalidación de métodos demuestra polimorfismo en tiempo de ejecución o distribución dinámica de métodos. Esto significa que el método que se va a llamar se resuelve en tiempo de ejecución en lugar de durante la compilación.

Para evitar que se anule un método, utilice la palabra clave final .

 final void message (){
System.out.println("
Thank you for opening an account with us!");
}

Cuando una subclase intenta anularla, se producirá un error de compilación.

Idealmente, todos los métodos llamados dentro de un constructor deberían ser finales . Esto es para evitar cambios no deseados que puedan ser causados ​​por las subclases.

A veces, es posible que deba acceder a un método anulado dentro del método anulado. Puede usar la palabra clave super seguida del operador de punto ( . ) Y el nombre del método en tal caso.

Considere la superclase Animal .

 class Animal{
public void move() {
System.out.println("
I can move.");
}
}

A continuación se muestra una subclase, llamada Fish , que anula move () :

 class Fish extends Animal {
public void move() {
System.out.println("
I can swim.");
super.move();
}
public static void main(String args[]){
Fish Tilapia = new Fish();
Tilapia.move();
}
}

Producción:

 I can swim.
I can move.

Al anular un método, también debe tener en cuenta el modificador de acceso utilizado. El modificador en la subclase debe tener el mismo nivel de visibilidad o más alto que en la clase base. Por ejemplo, si el método de la clase base se define como protegido , el método de reemplazo puede ser protegido o público .

Código simple con polimorfismo

La anulación y la sobrecarga de métodos son importantes para la simplificación del código, y el código simple es una buena práctica.

¿Por qué? Imagine una base de código compleja con más entresijos que la Grand Central Station. Ahora imagina que un error devastador comienza a destruir tu arduo trabajo ante tus propios ojos. Debe aislar la fuente de la infección y debe hacerlo rápidamente.

Buena suerte, no simplificó su código … Ahora está a punto de recibir una verdadera lección de criptografía. Emplear estructuras de datos efectivas y hacer lo que pueda para acortar el código (como tener en cuenta DRY) es su mejor defensa contra una situación como esta.

El siguiente paso en su lista de aprendizaje de Java debería ser trabajar con matrices. Son estructuras de datos importantes que se utilizan para almacenar lotes de puntos de datos.