1. Baleias e vacas

Aqui está um fato zoológico interessante: uma vaca está muito mais próxima de uma baleia do que, por exemplo, de um hipopótamo. Acontece que vacas e baleias são parentes relativamente próximos.

Olhe aqui. Vamos falar sobre polimorfismo — outra ferramenta muito poderosa de OOP . Ele tem quatro recursos.


2. Herança não é uma panacéia

Imagine que você escreveu uma Cowclasse para um jogo. Tem muitos campos e métodos. Objetos desta classe podem fazer várias coisas: andar, comer e dormir. As vacas também usam um sino que toca quando elas andam. Suponha que você implementou tudo na classe nos mínimos detalhes.

E aí chega sua cliente e diz que quer lançar uma nova fase do jogo, em que toda a ação se passa no mar, e o personagem principal é uma baleia.

Você começa a projetar uma Whaleclasse e percebe que ela é apenas ligeiramente diferente da Cowclasse. A lógica das duas classes é muito parecida e você decide usar herança.

Polimorfismo em Java

A Cowclasse é ideal para assumir o papel da classe pai: ela possui todas as variáveis ​​e métodos necessários. Tudo o que precisamos fazer é dar à baleia a capacidade de nadar. Mas há um problema: sua baleia tem patas, chifres e um sino. Afinal, essa funcionalidade é implementada dentro da Cowclasse. O que pode ser feito aqui?

Polimorfismo em Java.  Herança

3. Sobreposição de método

A substituição de método vem em nosso socorro. Se herdamos um método que não faz exatamente o que queremos em nossa nova classe, podemos substituir esse método por outro.

Substituição de método

Como isso é feito? Em nossa classe descendente, declaramos o mesmo método que o método da classe pai que desejamos substituir. Nós escrevemos nosso novo código nele. E é isso — é como se o antigo método na classe pai simplesmente não existisse.

É assim que funciona:

Código Descrição
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");
   }
}
  • Duas classes são definidas aqui - CoweWhale
  • WhaleherdaCow
  • A Whaleclasse substitui o printName()método
public static void main(String[] args)
{
   Cow cow = new Cow();
   cow.printName();
}
Este código exibe o seguinte texto na tela:
I'm a cow
public static void main(String[] args)
{
   Whale whale = new Whale();
   whale.printName();
}
Este código exibe o seguinte na tela:
I'm a whale

Depois de herdar a Cowclasse e substituir o printNamemétodo, a Whaleclasse contém os seguintes dados e 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");
   }
}
Não conhecemos nenhum método antigo.