Las diferencias entre sobrecarga de métodos y 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. |
| La sobrecarga de métodos ayuda a aumentar la legibilidad del programa. | La anulación de métodos 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 requerir o no 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 firmas diferentes. | 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 utiliza para métodos sobrecargados. | El enlace dinámico se utiliza para anular métodos. |
| Rendimiento deficiente debido al polimorfismo en tiempo de compilación. | Da un mejor rendimiento. La razón detrás de esto es que la vinculación de métodos anulados se realiza en tiempo de ejecución. |
| 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 de métodos. |
Sobrecarga de métodos en Java
Sobrecarga de métodos es un Polimorfismo en 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 retorno 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 retorno del método.
Ejemplo de sobrecarga de métodos:
Java
// Java Program to Implement // Method Overloading 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; } // Main Function public static void main(String args[]) { System.out.println('add() with 2 parameters'); // Calling function with 2 parameters System.out.println(add(4, 6)); System.out.println('add() with 3 parameters'); // Calling function with 3 Parameters System.out.println(add(4, 6, 7)); } }> Producción
add() with 2 parameters 10 add() with 3 parameters 17>
Anulación de métodos en Java
Anulación de métodos es un Polimorfismo en 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 retorno debe ser el mismo o covariante (el tipo de retorno puede variar en la misma dirección que la clase derivada).
Ejemplo de anulación de método:
Java // Java Program to implement // Method Overriding import java.io.*; // Base Class class Animal { void eat() { System.out.println('eat() method of base class'); System.out.println('eating.'); } } // Inherited Class class Dog extends Animal { void eat() { System.out.println('eat() method of derived class'); System.out.println('Dog is eating.'); } } // Driver Class class MethodOverridingEx { // Main Function public static void main(String args[]) { Dog d1 = new Dog(); Animal a1 = new Animal(); d1.eat(); a1.eat(); // Polymorphism: Animal reference pointing to Dog object Animal animal = new Dog(); // Calls the eat() method of Dog class animal.eat(); } }> Producción
eat() method of derived class Dog is eating. eat() method of base class eating. eat() method of derived class Dog is eating.>
Explicación del programa anterior:
Aquí, podemos ver que un método eat() se ha anulado en el nombre de la clase derivada. Perro que ya está proporcionado por 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 de la clase derivada eat() en lugar del método de la clase base eat(), y cuando creamos la instancia de la clase Animal y llamamos a la clase eat( ), vemos que solo se ejecuta el método eat() de la clase base en lugar del método de clase derivada eat().