Herança
É comum em programação orientada a objetos a criação de um modelo para alguma coisa (por exemplo um Animal), e depois precisar de um modelo especializado do original. Por exemplo, pode ser necessária a modelagem de um Peixe ou de um Cavalo que seriam um tipo de Animal, porém com algumas características a mais ou diferenciadas.
Considere o exemplo abaixo.
public class Animal {Percebe-se pelo exemplo que houve a duplicação de variáveis entre as classes
public String habitoAlimentar = "";
public String reproducao = "";
public double pesoMedio = 0.0;
public Animal(){}
public Animal(String habitoAlimentar, String reproducao,
double pesoMedio){
...
}
public String detalhaAnimal(){
...
}
}
public class Cavalo {
public String habitoAlimentar = "";
public String reproducao = "";
public double pesoMedio = 0.0;
public String raca = "";
public String corPelagem = "";
public Cavalo(){}
public Cavalo(String habitoAlimentar, String reproducao,
double pesoMedio, String raca, String corPelagem){
...
}
public String detalhaAnimal(){
...
}
}
Animal
e Cavalo
. Além disso pode também existir vários métodos que sejam válidos para ambos. Para evitar esse tipo de repetições desnecessárias é recomendada a criação de subclasses daquelas já existentes (utilização de herança).Em linguagens orientadas a objeto o mecanismo da herança permite ao programador definir uma classe com termos de uma classe anteriormente definida. Em java é utilizada a palavra-chave
extends
para este propósito como mostra o exemplo abaixo.
public class Cavalo extends Animal {Descrevendo a classe
private String raca = "";
private String corPelagem = "";
}
Cavalo
como "é um" Animal
não é apenas um modo conveniente de descrever a relação entre as duas classes faz com que o programador se lembre que Cavalo
tem todos os membros, tanto atributos como métodos, da classe pai Animal
. Isso também significa que se uma operação é válida para Animal
então ela também é válida para Cavalo
. Assim se a classe pai Animal
possui o método detalhaAnimal a classe Cavalo
também a possui.Veja abaixo como seria o diagrama de classe para as classes Animal e Cavalo usando herança.
Sintaxe para uma classe que herda outra:
[modificador] class [nomeDaClasse] extends [nomeDaClassePai]{Vale lembrar que uma herança em Java os contrutores não são herdados, assim se uma classe pai não houver um construtor padrão (sem parâmetros) a classe filha deve implementar uma chamada ao construtor da classe pai com os parâmetros necessários para o contrutor da classe pai. Exemplo: Se a classe pai possui apenas um construtor na forma
[declarações]
}
pai(int x){}
a classe filha deve obrigatoriamente implementar um construtor da seguinte forma: filha(int n){ super(n) }
Herança Simples
A linguagem de programação Java permite que uma classe extenda apenas a uma outra classe. A esta restrição damos o nome de Herança simples. Apesar de possiur a restrição de herança simples, java pode realizar tarefa semelhante a herança múltipla com a utilização de interfaces da seguinte forma:
- Uma classe implementando várias interfaces
- Uma interface extendendo várias interfaces
Interfaces são conjuntos de métodos vazios (não implementados) e constantes. As interfaces não possuem atributos e interfaces são, de forma simplificada, como roteiros a serem seguidos pelas classes que a implementam. Quando uma classe implementa certa interface ela deve implementar cada um dos seus métodos.