Home > Java, Linux > Annotation @Override, Polimorfismo, Herencia

Annotation @Override, Polimorfismo, Herencia

September 15th, 2009 admin Leave a comment Go to comments

Ahora ando aprendiendo Annotations en Java.

Leyendo la función del annotation @Override, consiste en que si la clase Padre y  la hija tienen un método con el mismo nombre, con este annotation no hace una sobre carga del método sino que lo redifine usando el método de la clase Hija, al fin y al cabo esa clase es la que usa el annotation.

Haciendo un ejercicio con una clase base ‘Parent’ y otra clase ‘Child’ que hereda, en ambas clases hay solo un método llamado ‘doWork()’ pero que imprimen distintos mensajes, la clase hija ‘Child’ declara un annotation ‘@Override’ obtuve mensjaes de error y comportamientos no deseados, moleste mucho con las clases y tenia esto:

// Clase Parent.java
class Parent {
public static void doWork ()
{
System.out.println (” Padre”);
}
}

// Clase Child
class Child extends Parent {
@Override    –> Acá uso el annotation para redefinir el método de la clase Padre
public static void doWork ()
{

System.out.println (” Hijo”);
}
public static void main (String args[])
{
Parent niño = new Child ();  // Polimorfismo, un Child es de tipo Parent, por eso es posible, no aplica a la inversa
Child niña = new Child ();

niño.doWork ();
niña.doWork ();
}
}

Al compilar la clase ‘Child’ obtenia este mensaje de error:

Child.java:5: method does not override or implement a method from a supertype
@Override
^
1 error

Si comentaba la línea del anotation podia compilar y obtenía una salida no deseada:

$ java Child
Padre
Hijo

Esto que significa?, que no esta funcionando el polimorfismo, mucho menos una sobrecarga de método, la salida que debo obtener es en ambos casos Hijo Hijo, no debe imprimir en ningún momento el texto Padre, despúes de reventar cabeza un rato, descubrí el motivo:

Los métodos static como son los métodos doWork() de las dos clases son métodos de Clase, no de instancia, es decir, no están asociados al objeto instanciado (Child) sino a la clase, así cree n cantidad de objetos de tipo ‘Child’, siempre existirá ese método por la clase ‘Parent’, por eso cuando el objeto niño llama el método doWork() no hace uso del método de un objeto que sería de tipo ‘Child’ sino que usa el método de dicha clase.
Por esa razón no hay polimorfismo, y obtengo el error al compilar con el annotation ‘@Override’.

Solución, quitar la palabra static de los métodos:

// Clase Parent.java
class Parent {
public void doWork () // Sin static
{
System.out.println (” Padre”);
}
}

// Clase Child
class Child extends Parent {
@Override
public void doWork () // Sin static
{

System.out.println (” Hijo”);
}
public static void main (String args[])
{
Parent niño = new Child ();  // Polimorfismo, un Child es de tipo Parent, por eso es posible, no aplica a la inversa
Child niña = new Child ();

niño.doWork ();
niña.doWork ();
}
}

$ java Child
Hijo
Hijo

Pd: Creo que este post esta muy aburrido.

Comparte:
  • TwitThis
  • Facebook
  • del.icio.us
  • email
  • MyShare
  • MySpace
  • RSS
  • Twitter
  • LinkedIn
  • PDF
  • Ping.fm
  1. manuelz
    October 31st, 2009 at 12:35 | #1

    Gracias por la explicacion… necesitaba saberlo. Saludos!

  2. November 1st, 2009 at 09:51 | #2

    Saludos Manuel.
    Este tipo de comentarios me animan mucho y me indican que el camino recorrido es el correcto.
    Gracias por el comentario y por visitar el blog

  1. No trackbacks yet.