Herança
Autor: oberdan martins | Publicado: 2012-02-15T10:01:00-08:00


&nbsp;Herança é uma forma de reutilização de softwares em que uma nova classe é criada absorvendo &nbsp;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:&nbsp;Imagine que&nbsp;estivéssemos implementando um programa que fosse utilizado em um concessionária&nbsp;de veículos. Esta concessionária vende carros de passeio, jipes e veículos utilitários.&nbsp;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&nbsp;que dizem respeito a apenas um dos tipos de veículos, isto é, no nosso modelo,&nbsp;apenas jipes têm tração 4x4, somente os carros de passeio têm opção de ligar o ar&nbsp;condicionado e os utilitários tem farol de milha.



Todas os demais estados e comportamentos&nbsp;são idênticos, na verdade para criar estas&nbsp;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&nbsp;corretamente o conceito de herança da programação Orientada a Objetos. Perceba&nbsp;que com exceção das características que estão grifadas todas as demais&nbsp;são comuns a todos os veículos, ou seja, é possível que tenhamos uma superclasse&nbsp;(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á&nbsp;compartilhar as suas características, dizemos que um jipe, carro de passeio ou&nbsp;utilitário são todos do tipo Veiculo. E da mesma forma toda a subclasse de Jipe irá&nbsp;herdar as características tanto de Veiculo quanto de Jipe.