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!!