Java - Anulación
En el capítulo anterior, hablamos de superclases y subclases. Si una clase hereda un método de su superclase, existe la posibilidad de anular el método siempre que no esté marcado como final.
El beneficio de anular es:la capacidad de definir un comportamiento que es específico para el tipo de subclase, lo que significa que una subclase puede implementar un método de clase principal según sus requisitos.
En términos orientados a objetos, anular significa anular la funcionalidad de un método existente.
Ejemplo
Veamos un ejemplo.
Demostración en vivoclass Animal { public void move() { System.out.println("Animals can move"); } } class Dog extends Animal { public void move() { System.out.println("Dogs can walk and run"); } } public class TestDog { public static void main(String args[]) { Animal a = new Animal(); // Animal reference and object Animal b = new Dog(); // Animal reference but Dog object a.move(); // runs the method in Animal class b.move(); // runs the method in Dog class } }
Esto producirá el siguiente resultado −
Salida
Animals can move Dogs can walk and run
En el ejemplo anterior, puede ver que aunque b es un tipo de Animal, ejecuta el método de movimiento en la clase Perro. La razón de esto es:en tiempo de compilación, la verificación se realiza en el tipo de referencia. Sin embargo, en el tiempo de ejecución, JVM determina el tipo de objeto y ejecutaría el método que pertenece a ese objeto en particular.
Por lo tanto, en el ejemplo anterior, el programa se compilará correctamente ya que la clase Animal tiene el método move. Luego, en tiempo de ejecución, ejecuta el método específico para ese objeto.
Considere el siguiente ejemplo −
Ejemplo
Demostración en vivoclass Animal { public void move() { System.out.println("Animals can move"); } } class Dog extends Animal { public void move() { System.out.println("Dogs can walk and run"); } public void bark() { System.out.println("Dogs can bark"); } } public class TestDog { public static void main(String args[]) { Animal a = new Animal(); // Animal reference and object Animal b = new Dog(); // Animal reference but Dog object a.move(); // runs the method in Animal class b.move(); // runs the method in Dog class b.bark(); } }
Esto producirá el siguiente resultado −
Salida
TestDog.java:26: error: cannot find symbol b.bark(); ^ symbol: method bark() location: variable b of type Animal 1 error
Este programa arrojará un error de tiempo de compilación ya que el tipo de referencia Animal de b no tiene un método con el nombre de corteza.
Reglas para la anulación de métodos
-
La lista de argumentos debe ser exactamente la misma que la del método anulado.
-
El tipo de devolución debe ser el mismo o un subtipo del tipo de devolución declarado en el método anulado original en la superclase.
-
El nivel de acceso no puede ser más restrictivo que el nivel de acceso del método invalidado. Por ejemplo:si el método de la superclase se declara público, el método de reemplazo en la subclase no puede ser privado ni protegido.
-
Los métodos de instancia pueden anularse solo si son heredados por la subclase.
-
Un método declarado final no se puede anular.
-
Un método declarado estático no se puede anular, pero se puede volver a declarar.
-
Si un método no se puede heredar, entonces no se puede anular.
-
Una subclase dentro del mismo paquete que la superclase de la instancia puede anular cualquier método de superclase que no se haya declarado privado o final.
-
Una subclase en un paquete diferente solo puede anular los métodos no finales declarados públicos o protegidos.
-
Un método anulado puede generar cualquier excepción sin marcar, independientemente de si el método anulado genera excepciones o no. Sin embargo, el método de anulación no debe generar excepciones comprobadas que sean nuevas o más amplias que las declaradas por el método anulado. El método de anulación puede arrojar menos o menos excepciones que el método anulado.
-
Los constructores no se pueden anular.
Uso de la palabra clave super
Al invocar una versión de superclase de un método anulado, el super se utiliza la palabra clave.
Ejemplo
Demostración en vivoclass Animal { public void move() { System.out.println("Animals can move"); } } class Dog extends Animal { public void move() { super.move(); // invokes the super class method System.out.println("Dogs can walk and run"); } } public class TestDog { public static void main(String args[]) { Animal b = new Dog(); // Animal reference but Dog object b.move(); // runs the method in Dog class } }
Esto producirá el siguiente resultado −
Salida
Animals can move Dogs can walk and run
Java
- Operadores Java
- Interfaz Java
- Prueba de Java con recursos
- Método String Length () en Java:cómo encontrar con el ejemplo
- Método Java String indexOf() con subcadena y ejemplos
- Método Java String charAt() con ejemplo
- Método Java String compareTo():cómo usarlo con ejemplos
- Método Java String contains() | Comprobar subcadena con ejemplo
- Java String termina con () método con ejemplo
- Método Java String replace(), replaceAll() y replaceFirst()
- Variable estática en Java:¿Qué es el bloque estático y el método? [Ejemplo]