1. Ballenas y vacas

Aquí hay un hecho zoológico interesante: una vaca está mucho más cerca de una ballena que, por ejemplo, de un hipopótamo. Resulta que las vacas y las ballenas son parientes relativamente cercanos.

Mira aquí. Hablemos sobre el polimorfismo , otra herramienta muy poderosa de OOP . Tiene cuatro características.


2. La herencia no es una panacea

Imagina que has escrito una Cowclase para un juego. Tiene muchos campos y métodos. Los objetos de esta clase pueden hacer varias cosas: caminar, comer y dormir. Las vacas también usan una campana que suena cuando caminan. Suponga que ha implementado todo en la clase hasta el más mínimo detalle.

Y luego llega tu cliente y dice que quiere lanzar un nuevo nivel de juego, en el que toda la acción tiene lugar en el mar, y el personaje principal es una ballena.

Comienzas a diseñar una Whaleclase y te das cuenta de que solo es ligeramente diferente de la Cowclase. La lógica de ambas clases es muy similar y decides usar la herencia.

Polimorfismo en Java

La Cowclase es ideal para asumir el papel de la clase padre: tiene todas las variables y métodos necesarios. Todo lo que tenemos que hacer es darle a la ballena la capacidad de nadar. Pero hay un problema: tu ballena tiene patas, cuernos y una campana. Después de todo, esta funcionalidad se implementa dentro de la Cowclase. ¿Qué se puede hacer aquí?

Polimorfismo en Java.  Herencia

3. Anulación de métodos

La anulación de métodos viene a nuestro rescate. Si heredamos un método que no hace exactamente lo que queremos en nuestra nueva clase, podemos reemplazar ese método con otro.

Anulación de método

¿Cómo se hace esto? En nuestra clase descendiente, declaramos el mismo método que el método de la clase principal que queremos anular. Escribimos nuestro nuevo código en él. Y eso es todo, es como si el método anterior en la clase principal simplemente no existiera.

Así es como funciona:

Código Descripción
class Cow
{
   public void printColor ()
   {
      System.out.println("I'm a white whale");
   }

   public void printName()
   {
      System.out.println("I'm a cow");
   }
}

class Whale extends Cow
{
   public void printName()
   {
      System.out.println("I'm a whale");
   }
}
  • Aquí se definen dos clases, CowyWhale
  • WhaleheredaCow
  • La Whaleclase anula el printName()método.
public static void main(String[] args)
{
   Cow cow = new Cow();
   cow.printName();
}
Este código muestra el siguiente texto en la pantalla:
I'm a cow
public static void main(String[] args)
{
   Whale whale = new Whale();
   whale.printName();
}
Este código muestra lo siguiente en la pantalla:
I'm a whale

Después de heredar la Cowclase y anular el printNamemétodo, la Whaleclase en realidad contiene los siguientes datos y métodos:

class Whale
{
   public void printColor()
   {
      System.out.println("I'm a white whale");
   }

   public void printName()
   {
      System.out.println("I'm a whale");
   }
}
No conocemos ningún método antiguo.