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 :
|
Lembrando que é fundamental encerrar a aula de hoje...
|