Ambas reutilizan un de método, pero son fundamentalmente diferentes. = mismo nombre, , en la misma clase, resuelto en . = una subclase un método padre con la , resuelto en .
Ambas reutilizan un de método, pero son fundamentalmente diferentes. = mismo nombre, , en la misma clase, resuelto en . = una subclase un método padre con la , resuelto en .
| Sobrecarga | Anulación | |
|---|---|---|
| Firma | Debe diferir (parámetros) | Debe ser idéntica |
| Relación | Misma clase | Padre ↔ subclase |
| Resuelto | Tiempo de compilación (static) | Tiempo de ejecución (dynamic) |
| Propósito | Conveniencia / variantes | Polimorfismo |
class Printer {
void print(String s) { System.out.println(s); }
void print(int n) { System.out.println(n); } // same name, diff param
void print(String s, int times) { /* ... */ }
}
El compilador elige cuál print según los tipos de argumentos — no hay herencia involucrada.
class Animal { String speak() { return "..."; } }
class Dog extends Animal {
@Override
String speak() { return "Woof"; } // replaces Animal.speak()
}
Animal a = new Dog();
a.speak(); // "Woof" — runtime picks Dog's version (dynamic dispatch)
Un error frecuente es sobrecargar accidentalmente cuando quisiste anular (p. ej. un error tipográfico en la firma). Siempre usa @Override (Java) u override (C#) para que el compilador lo detecte.
La anulación es el motor del polimorfismo — el mecanismo de tiempo de ejecución que hace que "una interfaz, muchas implementaciones" funcione.
Conocer la diferencia evita un error clásico: pensar que reemplazaste el comportamiento cuando en realidad creaste un segundo método que nunca se llamará.