Las diferencias entre la sobrecarga de métodos y la anulación de métodos en Java son las siguientes:
Sobrecarga de métodos |
Anulación de métodos |
---|---|
La sobrecarga de métodos es un polimorfismo en tiempo de compilación. | La anulación de métodos es un polimorfismo en tiempo de ejecución. |
Ayuda a aumentar la legibilidad del programa. | Se utiliza para otorgar la implementación específica del método que ya proporciona su clase principal o superclase. |
Ocurre dentro de la clase. | Se realiza en dos clases con relaciones de herencia. |
La sobrecarga de métodos puede o no requerir herencia. | La anulación de métodos siempre necesita herencia. |
En la sobrecarga de métodos, los métodos deben tener el mismo nombre y diferentes firmas. | En la anulación de métodos, los métodos deben tener el mismo nombre y la misma firma. |
En la sobrecarga de métodos, el tipo de retorno puede o no ser el mismo, pero solo tenemos que cambiar el parámetro. | En la anulación de métodos, el tipo de valor devuelto debe ser el mismo o covariante. |
El enlace estático se usa para métodos sobrecargados. | El enlace dinámico se utiliza para anular métodos. |
Da un mejor rendimiento. La razón detrás de esto es que el enlace de los métodos anulados se realiza en tiempo de ejecución. | Bajo rendimiento |
Los métodos privados y finales pueden estar sobrecargados. | Los métodos privados y finales no se pueden anular. |
La lista de argumentos debe ser diferente al realizar la sobrecarga de métodos. | La lista de argumentos debe ser la misma en la anulación del método. |
Sobrecarga del método :
La sobrecarga de métodos es un polimorfismo de tiempo de compilación . En la sobrecarga de métodos, más de un método comparte el mismo nombre de método con una firma diferente en la clase. En la sobrecarga de métodos, el tipo de devolución puede o no ser el mismo, pero tenemos que cambiar el parámetro porque, en Java, no podemos lograr la sobrecarga de métodos cambiando solo el tipo de devolución del método.
Ejemplo de sobrecarga de métodos:
Java
import java.io.*; class MethodOverloadingEx { static int add(int a, int b) { return a + b; } static int add(int a, int b, int c) { return a + b + c; } public static void main(String args[]) { System.out.println("add() with 2 parameters"); System.out.println(add(4, 6)); System.out.println("add() with 3 parameters"); System.out.println(add(4, 6, 7)); } }
add() with 2 parameters 10 add() with 3 parameters 17
Anulación del método :
La anulación de métodos es un polimorfismo de tiempo de ejecución . En la anulación de métodos, la clase derivada proporciona la implementación específica del método que ya proporciona la clase base o la clase principal. En la anulación de métodos, el tipo de valor devuelto debe ser el mismo o covariante (el tipo de valor devuelto puede variar en la misma dirección que la clase derivada).
Ejemplo: anulación de métodos
Java
import java.io.*; class Animal { void eat() { System.out.println("eat() method of base class"); System.out.println("eating."); } } class Dog extends Animal { void eat() { System.out.println("eat() method of derived class"); System.out.println("Dog is eating."); } } class MethodOverridingEx { public static void main(String args[]) { Dog d1 = new Dog(); Animal a1 = new Animal(); d1.eat(); a1.eat(); Animal animal = new Dog(); // eat() method of animal class is overridden by // base class eat() animal.eat(); } }
C++
#include<iostream> #include<stdio.h> using namespace std; class Animal { public: void eat() { cout<<"eat() method of base class"<<endl; cout<<"eating."<<endl; } }; class Dog:public Animal { public: void eat() { cout<<"eat() method of derived class"<<endl; cout<<"Dog is eating."<<endl; } }; int main() { Dog d1; d1.eat(); Animal a1; a1.eat(); return 0; }
eat() method of derived class Dog is eating. eat() method of base class eating. eat() method of derived class Dog is eating.
Explicación de salida:
Aquí, podemos ver que un método eat() se anuló en el nombre de la clase derivada Dog que ya proporciona el nombre de la clase base Animal . Cuando creamos la instancia de la clase Dog y llamamos al método eat(), vemos que solo se ejecuta el método eat() de la clase derivada en lugar del método de la clase base eat(), y cuando creamos la instancia de la clase Animal y llamamos al eat( ), vemos que solo se ejecuta el método eat() de la clase base en lugar del método eat() de la clase derivada.