Tenemos una clase principal y secundaria, que tiene un método con el mismo nombre pero los argumentos son primitivos y envoltorios. ¿Podría alguien explicar el motivo por el que esto se denominaría anulación de métodos y sobrecarga de métodos? Ejecutar este programa invocaría el método principal, que anularía y no sobrecargaría, buscando explicaciones.
class Parent { public void takeValue(int a) { System.out.println("take value method from parent is invoked"); } } class Child extends Parent { public void takeValue(Integer a) { System.out.println("take value method from child is invoked"); } public static void main(String[] args) { Parent p = new Child(); p.takeValue(new Integer(51)); } }El método está sobrecargado.
Ejecutar este programa invocaría el método principal, que anularía y no sobrecargaría
Sí. Está llamando a takeValue en una Parent principal, lo que significa que el compilador buscará una coincidencia de firma en la Parent . La sobrecarga ni siquiera es visible aquí (las firmas se comparan según los tipos estáticos, es decir, Java encuentra el método según el tipo de datos declarado de la variable en la que se llama al método, no con el tipo de datos del objeto asignado a la variable , que sería una cosa de tiempo de ejecución).
Y debido a que el compilador no considera public void takeValue(Integer a) al verificar la invocación del método, p.takeValue(new Integer(51)); está vinculado a Parent.takeValue(int) en virtud del autoboxing (habría coincidido con el otro método si ambos estuvieran visibles, o declarados en la clase Parent en este ejemplo).
Esto es sobrecargar. Tiene el mismo nombre pero el tipo de parámetros de entrada son diferentes.
Para confirmarlo, obtendrá un error cuando intente adjuntar la anotación @Override .
Integer e int son tipos diferentes.
En Java , la Overriding y la Overloading son conceptos muy importantes. Para comprender completamente las diferencias, le recomiendo que lea esto: