Herança é uma forma de reutilização de softwares em que uma nova classe é criada absorvendo membros de uma classe exixtentes e aprimorada com capacidades novas ou modificadas. Com a Herança, você pode economizar tempo durante o desenvolvimento de um programa baseando novas classes no software existente.
Ao herdar membros de uma classe exixtente, a classe que herdou é chamada de subclasse, e a que existia anteriormente chamada de superclasse.
Para ficar mais claros vamos partir para um exemplo: Imagine que estivéssemos implementando um programa que fosse utilizado em um concessionária de veículos. Esta concessionária vende carros de passeio, jipes e veículos utilitários. Para implementar as classes destes veículos poderíamos criar três classes distintas,
A seguir a classe Jipe:
public class Jipe {
private String marca;
private Double capacidadeTanqueCombustivel;
// Métodos Get e Set do atributo capacidadeTanqueCombustivel
public Double getTanqueCombustivel() {
return capacidadeTanqueCombustivel;
}
public void setTanqueCombustivel(Double capacidadeTanqueCombustivel) {
this.capacidadeTanqueCombustivel = capacidadeTanqueCombustivel;
}
// Métodos Get e Set do atributo marca
public String getMarca() {
return marca;
}
public void setMarca(String marca) {
this.marca = marca;
}
// Método para representar a tração do Jipe
public void ligarTracao4x4() {
// Código aqui
}
}
A classe que representa o nosso carro de passeio:
public class CarroPasseio {
private String marca;
private Double capacidadeTanqueCombustivel;
// Métodos Get e Set do atributo capacidadeTanqueCombustivel
public Double getTanqueCombustivel() {
return capacidadeTanqueCombustivel;
}
public void setTanqueCombustivel(Double capacidadeTanqueCombustivel) {
this.capacidadeTanqueCombustivel = capacidadeTanqueCombustivel;
}
// Métodos Get e Set do atributo marca
public String getMarca() {
return marca;
}
public void setMarca(String marca) {
this.marca = marca;
}
// Método para representar o ar condicionado do carro de passeio
public void ligarArCondicionado() {
// Código aqui
}
}
E, finalmente, a classe que representa o nosso veículo utilitário:
public class Utilitario {
private String marca;
private Double capacidadeTanqueCombustivel;
// Métodos Get e Set do atributo capacidadeTanqueCombustivel
public Double getTanqueCombustivel() {
return capacidadeTanqueCombustivel;
}
public void setTanqueCombustivel(Double capacidadeTanqueCombustivel) {
this.capacidadeTanqueCombustivel = capacidadeTanqueCombustivel;
}
// Métodos Get e Set do atributo marca
public String getMarca() {
return marca;
}
public void setMarca(String marca) {
this.marca = marca;
}
// Método para representar o farol de milha do carro utilitário
public void ligarFarolMilha() {
// Código aqui
}
}
Perceba que, nas linhas destacadas, temos as características que dizem respeito a apenas um dos tipos de veículos, isto é, no nosso modelo, apenas jipes têm tração 4x4, somente os carros de passeio têm opção de ligar o ar condicionado e os utilitários tem farol de milha.
Todas os demais estados e comportamentos são idênticos, na verdade para criar estas três classes foi realizado uma simples cópia e cola dos membros que são iguais. Agora, se a concessionária resolvesse criar mais 8 tipos de veiculos difrentes, teríamos que repetir todos esses códigos?
Na verdade nada disto seria necessário se nós tivéssemos utilizado corretamente o conceito de herança da programação Orientada a Objetos. Perceba que com exceção das características que estão grifadas todas as demais são comuns a todos os veículos, ou seja, é possível que tenhamos uma superclasse (classe Pai) Veiculo e que todas as demais herdem estas características comuns dela.
A nossa classe Veiculo ficaria da seguinte forma:
public class Veiculo {
private String marca;
private Double capacidadeTanqueCombustivel;
// Métodos Get e Set do atributo capacidadeTanqueCombustivel
public Double getTanqueCombustivel() {
return capacidadeTanqueCombustivel;
}
public void setTanqueCombustivel(Double capacidadeTanqueCombustivel) {
this.capacidadeTanqueCombustivel = capacidadeTanqueCombustivel;
}
// Métodos Get e Set do atributo marca
public String getMarca() {
return marca;
}
public void setMarca(String marca) {
this.marca = marca;
}
}
Tudo o que era comum a todos os veículos foi concentrado na classe Veiculo. Para que as demais classes herdem estas características nós devemos utilizar a palavra reservada extends.
Então, as classes que definimos anteriormente, seriam reescritas da seguinte forma:
// Classe que representa o Jipe
public class Jipe extends Veiculo{
public void ligarTracao4x4()
{
//Código aqui
}
}
// Classe que representa o Carro de passeio
public class CarroPasseio extends Veiculo{
public void ligarArCondicionado()
{
//Código aqui
}
}
// Classe que representa o Utilitário
public class Utilitario extends Veiculo {
public void ligarFarolMilha()
{
//Código aqui
}
}
Graficamente podemos representar esta hierarquia de classes da seguinte forma:
Nesta nova hierarquia de classes toda a subclasse de Veiculo irá compartilhar as suas características, dizemos que um jipe, carro de passeio ou utilitário são todos do tipo Veiculo. E da mesma forma toda a subclasse de Jipe irá herdar as características tanto de Veiculo quanto de Jipe.

Herança NÃO é uma forma de reutilização de "softwares" ! e sim reutilização de códigos !!
ResponderExcluirCuidado com o que publica !
Olha o erro de português!!!
ResponderExcluirexixtentes = existentes
exixtente = existentes
Se não sabe escrever, utilize um corretor ortográfico !
Opa !
ResponderExcluir"em um concessionária de veículos"
Cadê a corncordância ?
Correto: "em uma concessionária de veículos"
Oberdan, não faz isso com nossa categoria cara!
Fora os errinhos que os colegas acima citaram, esse foi a explicação mais clara que já encontrei!!
ResponderExcluirMuito bom!!