Ir al contenido principal

Sobrescritura de métodos en Java (Overriding)

Cada vez que se tiene una clase que hereda un método de una superclase, se tiene la oportunidad de sobreescribir el método (a menos que dicho método esté marcado como final). El beneficio clave al sobreescribir un método heredado es la habilidad de definir un comportamiento específico para los objetos de la subclase.Veamos un ejemplo de la sobreescritura de un método heredado:

public class Animal {

public void comer(){
System.out.println("Animal comiendo...");
}
}

class Caballo extends Animal{
public void comer(){
System.out.println("Caballo comiendo...");
}
}


Al momento de que Caballo hereda de la clase Animal obtiene el método comer() definido en Animal, sin embargo, se desea especificar un poco más el comportamiento de Caballo al momento de llamar a comer(), por lo tanto se define un método con el mismo nombre dentro de la clase Caballo. Debido a que ambos métodos tienen el mismo nombre, para saber qué método se invocará en tiempo de ejecución es necesario saber a qué objeto se está refiriendo. P. ej.:

public static void main(String... args){
Animal a = new Animal();
Caballo c = new Caballo();
a.comer();
c.comer();
}



Al ejecutar el código anterior obtenemos lo siguiente:

Animal comiendo...
Caballo comiendo...


Ahora en su versión polimórfica:

public static void main(String... args){
Animal a = new Caballo();
Caballo c = new Caballo();
a.comer();
c.comer();
}

Obtenemos lo siguiente:

Caballo comiendo...
Caballo comiendo...


En la primera ejecución del método tenemos una referencia a un Animal pero el objeto es un Caballo, por lo tanto, el método invocado es la versión definida en la clase Caballo. Es importante mencionar que al momento de invocar un método sobre una referencia Animal en un objeto Caballo solamente se podrá ejecutar el métodos si la clase Animal lo define, p. ej.:

class Animal {

public void comer(){
System.out.println("Animal comiendo...");
}
}

class Caballo extends Animal{
public void comer(){
System.out.println("Caballo comiendo...");
}
public void relinchar(){
System.out.println("Caballo relinchando...");
}
}

class ProbarMetodos{

public static void main(String... args){
Animal a = new Caballo();
Caballo c = new Caballo();
a.comer();
c.comer();
a.relinchar();
//error!
}
}


Aún cuando la clase Caballo define un método llamado relinchar(), la clase Animal no sabe que dicho método existe, por lo tanto, el compilador arrojará un error cuando se intente invocar al método relinchar() desde una referencia Animal, no importa que el objeto Caballo sí lo tenga.

Reglas para sobreescribir un método::

Las reglas básicas para la sobreescritura de métodos son las siguientes:

+ La lista de argumentos del método debe ser exactamente la misma.
+ El tipo de retorno debe de ser el mismo o un subtipo del tipo de retorno declarado originalmente.
+ El nivel de acceso no debe de ser más restrictivo.
+ El nivel de acceso puede ser menos restrictivo.
+ Los métodos de instancia pueden ser sobreescritos solamente si han sido heredados por la subclase.
+ Los métodos sobreescritos pueden arrojar cualquier excepción no verificada(de tiempo de ejecución) por el compilador.
+ Los métodos sobreescritos NO pueden arrojar excepciones verificadas por el compilador.
+ No se puede sobreescibir un método marcado como final.
+ No se puede sobreescibir un método marcado como estático (static).
+ Si un método no puede ser heredado, no puede ser sobreescrito.

Invocar la versión de la superclase de un método sobreescrito::

En algunas ocasiones necesitamos invocar al método escrito en la superclase en lugar de la versión que hemos sobreescrito, para ello se utiliza la palabra super seguida de un punto(.) y posteriormente el nombre del método a invocar, p. ej.:

class Caballo extends Animal{
public void comer(){
super.comer();
}
}


Hasta aquí llegamos con este tema. ¿Alguna duda? deja tu comentario.

Más sobre programación en Java aquí.

Comentarios

  1. Excelente es la segunda vez que miro y siempre es util a favoritos gracias!

    ResponderBorrar
  2. Ohhhhhhhhh!! Genialísimo!!
    Me has salvado la vida!
    Has logrado lo que mi profe no pudo *-*
    Logré entender!

    ResponderBorrar
  3. Mission Acomplished: Jajajajaja, gracias por tu comentario. Saludox.

    ResponderBorrar
  4. Gracias por la explicación. Estoy aprendiendo a programar en Java y tenía dudas sobre a que se referia el termino "Override", quedó aclarado.

    ResponderBorrar
  5. interesante la ayuda, pero podrias poner un ejemplo mas donde expliques paso por paso, donde no solo expliques acepciones sino tambien se vea detalladamente toda la rutina que hay que hacer para llegar a un resultado final. Me gustaria que fueraa asi.

    ResponderBorrar
  6. Claudia,
    Me gustaría que fueras más específica ya que, de acuerdo a mi punto de vista, la explicación que hago es paso a paso e intento explicar cuestiones generales en la sobreescritura de métodos. ¿Cuál es tu duda particular?

    ResponderBorrar
  7. CUAL ES LA PALABRA CLAVE QUE PERMITE SOBRESCRIBIR UN METODO HEREDADO?

    ResponderBorrar
  8. saben la verdad yo noy experto y debo comentar que estoy aprendiendo, a programar ahce poco, pero puedo comentar que la forma de comentar o de explicar el funcionamiento de una clase, metodo, arreglo etc me ha gustado muchisimo seguire buscando en este portal ejemplos, un usuario que queda mu agradecido de este portal

    ResponderBorrar
  9. Añadir un último caso, utilizando super en la clase derivada y fuera:

    class Animal {

    public void comer(){
    System.out.println("Animal comiendo...");
    }
    }
    class Caballo extends Animal{
    public void comer(){
    System.out.println("Caballo comiendo...");
    }

    public void usoSuper(){
    System.out.println(super.comer());
    }
    }

    public static void main(String... args){
    Animal a = new Animal();
    Animal b = new Caballo(); //Solo en este sentido
    Caballo c = new Caballo();
    a.comer();
    b.comer(); //Causa Overriding mostrando el de la derivada
    b.super.comer(); //Es afectado por el Overriding pero utilizando super accedemos al metodo de la classe de la cual hereda.
    c.usoSuper();
    }

    En este caso veríamos:

    Animal comiendo... //evidente
    Caballo comiendo... //sin utiliza super vemos la el metodo de la classe derivada
    Animal comiendo... //usando super
    Animal comiendo... //otro método encapsulando comer

    Espero que a alguien le pueda ser útil :)

    ResponderBorrar
  10. La Regla: "Los métodos sobreescritos NO pueden arrojar excepciones verificadas por el compilador".

    Quisiera matizar que:

    Precisamente el metodo que se sobreescribe (el super metodo o sobreescrito) es que que puede. El que no puede arrojar una excepcion verificada es el metodo que sobreescribe al super. Sin embargo puede arrojar menos excepciones que el super o bien una excepcion subclase de la que arroja el super.

    ResponderBorrar
  11. Gracias por tus comentarios. Te hago una pregunta de algo que no me queda del todo claro.

    Cuando hacés:

    public static void main(String... args){
    Animal a = new Caballo();
    Caballo c = new Caballo();
    a.comer();
    c.comer();
    }

    Obtenés:

    Animal comiendo...
    Caballo comiendo..

    Pero cuando hacés:

    class Animal {

    public void comer(){
    System.out.println("Animal comiendo...");
    }
    }

    class Caballo extends Animal{
    public void comer(){
    System.out.println("Caballo comiendo...");
    }
    public void relinchar(){
    System.out.println("Caballo relinchando...");
    }
    }

    class ProbarMetodos{

    public static void main(String... args){
    Animal a = new Caballo();
    Caballo c = new Caballo();
    a.comer();
    c.comer();
    a.relinchar(); //error!
    }
    }

    relinchar() tira en un error. ¿Por qué? Si por más que la referencia es un Animal el objeto es un Caballo, ¿no debería funcionar?
    Para mí si en el primer ejemplo 'a.comer()' devuelve "Caballo comiendo", en el segundo 'a.relinchar()' tendría que andar.

    ResponderBorrar
  12. Perfecto me saco de un gran apuro entendi mas rapido aqui que en la clase del profesor saludos.

    ResponderBorrar
  13. EXELENTE compadre entendi de maravilla saludos gracias. sigue posteando cosas de java (matrices y cosas asi )

    ResponderBorrar
  14. Exactamente lo que buscaba ;-) gracias

    ResponderBorrar
  15. buen articulo , pero hubiese sido mejor utilizar datos de la vida real para entender mejor su funcionalidad y donde usarlo , ejemplo con datos sistema banco...algo pequeño

    ResponderBorrar
  16. Que buena explicación, no encontré nada parecido por ahí, muchas gracias, sigue así.

    ResponderBorrar
  17. Buena mi negro, buena. Solo he visto dos de tus trabajos pero geniales. Buena onda :)

    ResponderBorrar
  18. No hay nada mas simple para entender este tema en java gracias Monillo007

    ResponderBorrar
  19. Muchas gracias por tu trabajo ! realmente se aprecia! sigue asi!

    ResponderBorrar
  20. Cuidado con lo que dices de las excepciones. Los métodos sobrescritos sí pueden lanzar excepciones verificadas, de acuerdo con ciertas normas.

    ResponderBorrar
  21. Muy buenos apuntes, gracias por compartir tu conocimiento

    ResponderBorrar

Publicar un comentario

Este es un espacio abierto, puedes escribir lo que gustes respetando los siguientes puntos:

1.- Lo que escribas esté relacionado con el post, si gustas contactarme puedes hacerlo aqui.

2.- Todo es cuestionable, aunque ten en cuenta que existen formas de hacerlo, evita las agresiones y revisa tu lenguaje antes de publicar un comentario.

3.- Siempre hay tres verdades: tu verdad, mi verdad y la verdad, por lo que opiniones diferentes no necesariamente son equivocadas.

4.- Los comentarios son una forma de discusión abierta, por lo que al publicar uno, implícitamente entras a una discusión, con todo lo que esto representa.

5. Me reservo el derecho de eliminar comentarios que no respeten las condiciones mencionadas anteriormente.

Toma en cuenta que puedes utilizar emoticones en tu comentario, para ver una lista de los disponibles da clic en este enlace.

Entradas más populares de este blog

3 sencillos pasos para tramitar la ayuda por desempleo de la AFORE

¿Tienes dinero ahorrado en tu AFORE y en este momento no estás trabajando o estás trabajando pero no tienes seguro social? Si respondiste sí a la pregunta anterior entonces hay una buena noticia para ti: puedes retirar una parte del dinero que tienes ahorrado. Y lo mejor, es muy sencillo. En este artículo te diré paso a paso qué hacer para obtener ese dinero, sin tecnicismos legales ni nada por el estilo, simple y sencillamente lo que necesitas saber. Paso Número 1: Obtener los últimos 2 estados de cuenta de tu Afore Esto en la mayoría de los casos es sumamente sencillo ya que dichos estados de cuenta llegan directamente al domicilio del ahorrador, si este es tu caso puedes saltar lo restante en este punto y continuar con el paso número 2, en caso contrario sigue leyendo… Si no tienes tus estados de cuenta debes ponerte en contacto con la empresa encargada de administrar tu ahorro para que te los proporcione, normalmente te van a pedir una identificación oficial, comprobante de

Conectar una base de datos en MySQL con NetBeans

NetBeans es una plataforma para el desarrollo de aplicaciones de escritorio usando Java y a un Entorno integrado de desarrollo (IDE) desarrollado usando la Plataforma NetBeans. Si eres un programador y desarrollas tus aplicaciones en Java seguramente necesitarás conectar una base de datos tipo MySQL a este entorno algún día, bueno, si lo necesitas ahora, he aquí una explicación paso a paso de cómo conectar ambas herramientas.

4 extraordinarias aplicaciones espía para Android

Le andas haciendo al James Bond y necesitas grabar video, voz o tomar fotos desde tu dispositivo Android sin ser notado? Aquí 4 excelentes aplicaciones que facilitarán tus hazañas de 007 en menos de lo que canta un gallo.

c606 c6nf5g4r6 e3 tec3ad6 [Como configurar el teclado]

¿Problemas al escribir con el teclado? ¿Tratas de escribir la letra ‘o’ y sale el número ‘6’ o algo por el estilo? La solución puede ser más simple de lo que parece. La solución a tu problema tras el salto...

Conexión, consulta y ejecución de sentencias en MySQL con Java

Anteriormente escribí este mismo artículo pero para bases de datos en Oracle . En este artículo prácticamente me copio y pego para explicar paso a paso cómo realizar la conexión a MySQL en Java, así como la forma de realizar consultas a los registros existentes y ejecutar sentencias de inserción, borrado y actualización de datos. Al final del artículo tendremos una clase que encapsulará todos los procedimientos necesarios para trabajar con la base de datos.