¿Cuál es la diferencia entre sobrecargar un método y anularlo en Java?

10

¿Cuál es la diferencia entre sobrecargar un método y anularlo en Java?

¿Hay alguna diferencia en la firma del método, el especificador de acceso, el tipo de retorno, etc.?

usuario63948
fuente
3
En PHP, la sobrecarga tiene un significado completamente diferente .
lortabac

Respuestas:

41

Para sobrecargar un método con un nuevo método, el nuevo método debe tener una firma diferente. Es decir, dos métodos sobrecargados tienen el mismo nombre, pero diferentes parámetros. Aquí hay un ejemplo de dos métodos sobrecargados:

boolean isOdd(int number) { ... };
boolean isOdd(float number) { ... };

Según los tipos de parámetros, se llamará al método correspondiente. Tenga en cuenta que cambiar el tipo de retorno no es suficiente (aunque puede hacer esto adicionalmente).

Cuando se anula un método, el nuevo método tiene la misma firma y reemplaza el método anulado en algunos casos. Aquí hay un ejemplo de un método anulado:

public class A 
{
     public void someMethod() { ... }
}

public class B extends A
{
     public void someMethod() { ... }
}

La elección se realiza en función del tipo de objeto. Por ejemplo,

A someA = new B();
someA.someMethod();

llamará al someMethodde B. Puede (y debe) agregar la anotación @Override:

public class B extends A
{
     @Override
     public void someMethod() { ... }
}

Ahora, si cambia accidentalmente los parámetros en B, el compilador le informará que no está anulando someMethod () sino sobrecargándolo.

superM
fuente
@scarfridge, gracias por la edición. No he estado programando con Java durante años y olvidé mucho)))
superM
1
Gracias por mencionar las anotaciones @Override y el hecho de que tener solo diferentes tipos de retorno no hace que un método se anule, sino que se sobrecargue.
Daniel Dinnyes
13

Sobrecarga, los métodos tienen el mismo nombre pero diferentes parámetros.

Anulando, la implementación dada en la clase base se reemplaza con la de la subclase.

NimChimpsky
fuente
1
por favor no edite / expanda esto. La brevedad es el punto.
NimChimpsky
7

Los conceptos sobre los que pregunta están cubiertos en tutoriales Java.

La explicación para anular se da de la siguiente manera:

Un método de instancia en una subclase con la misma firma (nombre, más el número y el tipo de sus parámetros) y el tipo de retorno como método de instancia en la superclase anula el método de la superclase.

La capacidad de una subclase para anular un método permite a una clase heredar de una superclase cuyo comportamiento es "lo suficientemente cercano" y luego modificar el comportamiento según sea necesario. El método de anulación tiene el mismo nombre, número y tipo de parámetros y tipo de retorno que el método que anula. Un método de anulación también puede devolver un subtipo del tipo devuelto por el método anulado. Esto se llama un tipo de retorno covariante .

Al anular un método, es posible que desee utilizar la @Overrideanotación que indica al compilador que tiene la intención de anular un método en la superclase. Si, por alguna razón, el compilador detecta que el método no existe en una de las superclases, generará un error. Para obtener más información sobre @Override, consulte Anotaciones ...

La sobrecarga se explica en el tutorial de la siguiente manera:

El lenguaje de programación Java admite métodos de sobrecarga, y Java puede distinguir entre métodos con diferentes firmas de métodos. Esto significa que los métodos dentro de una clase pueden tener el mismo nombre si tienen listas de parámetros diferentes (hay algunas calificaciones para esto que se discutirán en la lección titulada "Interfaces y herencia".

Suponga que tiene una clase que puede usar caligrafía para dibujar varios tipos de datos (cadenas, enteros, etc.) y que contiene un método para dibujar cada tipo de datos. Es engorroso de usar un nuevo nombre para cada método, por ejemplo, drawString, drawInteger, drawFloat, y así sucesivamente. En el lenguaje de programación Java, puede usar el mismo nombre para todos los métodos de dibujo pero pasar una lista de argumentos diferente a cada método. Por lo tanto, la clase de dibujo de datos podría declarar cuatro métodos nombrados draw, cada uno de los cuales tiene una lista de parámetros diferente ...

Los métodos sobrecargados se diferencian por el número y el tipo de argumentos pasados ​​al método ...

No puede declarar más de un método con el mismo nombre y el mismo número y tipo de argumentos, porque el compilador no puede distinguirlos.

El compilador no considera el tipo de retorno al diferenciar los métodos, por lo que no puede declarar dos métodos con la misma firma, incluso si tienen un tipo de retorno diferente.


Nota: Los métodos sobrecargados deben usarse con moderación, ya que pueden hacer que el código sea mucho menos legible.


La explicación anterior para la sobrecarga menciona las calificaciones discutidas en la lección titulada "Interfaces y herencia" :

En una subclase, puede sobrecargar los métodos heredados de la superclase. Tales métodos sobrecargados no ocultan ni anulan los métodos de la superclase; son métodos nuevos, exclusivos de la subclase.

mosquito
fuente
2

La sobrecarga de un método generalmente se define como "proporcionar múltiples métodos disponibles con el mismo nombre, que difieren en el número y tipo de entradas y salidas". Por lo general, el concepto es que desea poder realizar la misma operación básica dados diferentes conjuntos de entradas: puede, por ejemplo, "agregar" dos valores de tipo numérico, sin embargo, generalmente es importante saber cuál es el tipo exacto de el valor es para que pueda aprovechar o planificar comportamientos específicos de ese tipo. Como tal, definiría un método para cada combinación de tipos numéricos (y / o colecciones) que desee admitir. Todos estos métodos tienen el mismo nombre, pero diferentes "firmas"; en tiempo de compilación,

Reemplazar un método generalmente se define como "proporcionar una implementación diferente en una clase derivada de un método con una firma particular definida en la clase base". Hay muchas razones para anular un método; Prácticamente todos ellos tienen en común el hecho de que la clase derivada tiene un conocimiento adicional de lo que debe hacerse, que la clase base no puede conocer. Hay dos sabores de anulación en la mayoría de los idiomas OO; la anulación puede reemplazar el método de la clase base, o puede extenderEl método de la clase base. La diferencia generalmente es que una clase derivada que está extendiendo una implementación de clase base llamará a la versión anulada de la clase base del método en algún momento durante la ejecución del método de anulación. Esto permite que las clases primarias "reutilicen" áreas comunes de la operación que están contenidas en la clase base.

KeithS
fuente