En este tutorial, aprenderemos sobre la anulación de métodos en Java con la ayuda de ejemplos.
En el último tutorial, aprendimos sobre la herencia. La herencia es una propiedad OOP que nos permite derivar una nueva clase (subclase) de una clase existente (superclase). La subclase hereda los atributos y métodos de la superclase.
Ahora bien, si se define el mismo método tanto en la superclase como en la subclase, entonces el método de la clase subclase anula el método de la superclase. Esto se conoce como anulación de método.
Ejemplo 1: Anulación de método
class Animal ( public void displayInfo() ( System.out.println("I am an animal."); ) ) class Dog extends Animal ( @Override public void displayInfo() ( System.out.println("I am a dog."); ) ) class Main ( public static void main(String() args) ( Dog d1 = new Dog(); d1.displayInfo(); ) )
Salida :
Yo soy un perro.
En el programa anterior, el displayInfo()
método está presente tanto en la superclase Animal como en la subclase Perro.
Cuando llamamos displayInfo()
usando el objeto d1 (objeto de la subclase), se llama al método dentro de la subclase Dog. El displayInfo()
método de la subclase anula el mismo método de la superclase.
Observe el uso de la @Override
anotación en nuestro ejemplo. En Java, las anotaciones son los metadatos que usamos para proporcionar información al compilador. Aquí, la @Override
anotación especifica al compilador que el método después de esta anotación anula el método de la superclase.
No es obligatorio su uso @Override
. Sin embargo, cuando usamos esto, el método debe seguir todas las reglas de anulación. De lo contrario, el compilador generará un error.
Reglas de reemplazo de Java
- Tanto la superclase como la subclase deben tener el mismo nombre de método, el mismo tipo de retorno y la misma lista de parámetros.
- No podemos anular el método declarado como
final
ystatic
. - Siempre debemos anular los métodos abstractos de la superclase (se discutirá en tutoriales posteriores).
super palabra clave en Java Overriding
Una pregunta común que surge al realizar la anulación en Java es:
¿Podemos acceder al método de la superclase después de anular?
Bueno, la respuesta es sí . Para acceder al método de la superclase desde la subclase, usamos la super
palabra clave.
Ejemplo 2: uso de una súper palabra clave
class Animal ( public void displayInfo() ( System.out.println("I am an animal."); ) ) class Dog extends Animal ( public void displayInfo() ( super.displayInfo(); System.out.println("I am a dog."); ) ) class Main ( public static void main(String() args) ( Dog d1 = new Dog(); d1.displayInfo(); ) )
Salida :
Soy un animal Yo soy un perro.
En el ejemplo anterior, la subclase Perro anula el método displayInfo()
de la superclase Animal.
Cuando llamamos al método displayInfo()
usando el objeto d1 de la subclase Dog, se llama al método dentro de la subclase Dog; no se llama al método dentro de la superclase.
Dentro displayInfo()
de la subclase Dog, solíamos super.displayInfo()
llamar displayInfo()
a la superclase.
Es importante señalar que los constructores en Java no se heredan. Por lo tanto, no existe la anulación de constructores en Java.
Sin embargo, podemos llamar al constructor de la superclase desde sus subclases. Para eso usamos super()
. Para obtener más información, visite la palabra clave super Java.
Especificadores de acceso en la anulación de métodos
El mismo método declarado en la superclase y sus subclases pueden tener diferentes especificadores de acceso. Sin embargo, existe una restricción.
Solo podemos usar esos especificadores de acceso en subclases que proporcionan un acceso mayor que el especificador de acceso de la superclase. Por ejemplo,
Supongamos que myClass()
se declara un método de la superclase protected
. Entonces, el mismo método myClass()
en la subclase puede ser public
o protected
, pero no private
.
Ejemplo 3: Especificador de acceso en anulación
class Animal ( protected void displayInfo() ( System.out.println("I am an animal."); ) ) class Dog extends Animal ( public void displayInfo() ( System.out.println("I am a dog."); ) ) class Main ( public static void main(String() args) ( Dog d1 = new Dog(); d1.displayInfo(); ) )
Salida :
Yo soy un perro.
En el ejemplo anterior, la subclase Perro anula el método displayInfo()
de la superclase Animal.
Siempre que llamamos displayInfo()
usando el d1 (objeto de la subclase), se llama al método dentro de la subclase.
Tenga en cuenta que displayInfo()
se declara protected
en la superclase Animal. El mismo método tiene el public
especificador de acceso en la subclase Perro. Esto es posible porque public
proporciona un mayor acceso que el protected
.
Métodos abstractos primordiales
En Java, las clases abstractas se crean para ser la superclase de otras clases. Y, si una clase contiene un método abstracto, es obligatorio anularlo.
Aprenderemos más sobre las clases abstractas y la sustitución de métodos abstractos en tutoriales posteriores.