Herança e Classes Abstratas

Aula de Laboratório

Objetivos:

1. Classes Abstratas


Relembrando o exercício dos animais:

 

Ao implementar essa hierarquia, percebemos que o código da classe animal é muito genérico:

public class Animal
{
  private String nome;

  public Animal(String n) {
    nome = n;
  }

  public void imp() {
    System.out.println("Nome: "+nome);
  }

  public String getName() { return(nome); }

  public void talk() {
    System.out.println("Eu nao falo");
  }
}

Na prática, nunca iremos instanciar um animal, pois ele serve apenas para a criação de pássaros e mamíferos. Seguindo a mesma lógica, essas duas classes também não serão instanciadas. Ou seja, somente as classes derivadas de Passaro (BemTeVi, Papagaio) e Mamifero (Cachorro, Vaca) é que serão usadas efetivamente.

Para esse tipo de situação, Java suporta a criação de uma classe abstrata. Esse tipo de classe não pode ser instanciado, e serve apenas para derivarmos novas classes. Veja como a classe animal pode ser implementada dessa forma:

public abstract class Animal
{
  private String nome;

  public Animal(String n) {
    nome = n;
  }

  public void imp() {
    System.out.println("Nome: "+nome);
  }

  public String getName() { return(nome); }

  public abstract void talk();
}

Observe que o método talk() também foi declarado como abstract: isso significa que esse método não foi implementado nesta classe e deverá, obrigatoriamente, ser implementado nas classes derivadas. Consequentemente, as classes Passaro e Mamifero também serão classes abstratas:

public abstract class Passaro extends Animal
{
  public Passaro(String n) {
    super(n);
  }

  public void talk() {
    System.out.println("Piu piu");
  }
}

Repare que o método talk() em Mamifero é abstract, pois não tem implementação. Já em Passaro, tem.

public abstract class Mamifero extends Animal
{
  public Mamifero(String n) {
    super(n);
  }

  public abstract void talk();
}

Além de fornecer uma modelagem mais robusta ao programador, as classes abstratas também são representadas de forma mais eficiente, pois nunca precisarão ser instanciadas.

Exercícios :

  • Finalize o exercício dos animais, utilizando classes abstratas.
  • Refaça os exercícios dos professores (Professor, ProfessorRegime, ProfessorHorista) e das formas (Forma, Forma2D, Forma3D, ...). Quais classes que podem ser abstratas em cada caso ?
  • Suponha uma classe Lista, capaz de gerenciar uma lista encadeada. Imagine como a idéia de herança poderia ser usada para implementar uma classe Pilha e uma classe Fila (cuja utilização é bastante óbvia...). Se possível, tente implementar essa hierarquia.

 

Lembrando que é fundamental encerrar a aula de hoje...

  • ...entendendo perfeitamente o funcionamento da herança em Java
  • ...conhecendo a utilidade das classes abstratas