Herança
Autor: MARCO ANTONIO BIDÓIA | Publicado: 2012-11-17T01:12:00-02:00



&nbsp; &nbsp; &nbsp;Herança&nbsp;é um princípio de&nbsp;orientação a objetos, que permite que&nbsp;classes&nbsp;compartilhem&nbsp;atributos&nbsp;e&nbsp;métodos, através de "heranças". Ela é usada na intenção de reaproveitar código ou comportamento generalizado ou especializar operações ou atributos. O conceito de herança de várias classes é conhecido como&nbsp;herança múltipla.(Fonte Wikipédia).



&nbsp; &nbsp; Neste exemplo iremos implementar uma classe pai(Veiculo) e duas classes filhas(Passeio e Transporte) e uma quarta que será a que vai executar nossa implementação.

Então temos:

01) Veiculo.java

02) Passeio.java

03) Transporte.java

04) UsandoVeiculo.java





&nbsp; &nbsp; &nbsp;Aqui na primeira classe Veiculo.java, adicionamos atributos que são de todos os tipos de veículo, como placa, cor e ano de fabricação.

&nbsp; &nbsp; Também iremos implementar um método para imprimir o relatório e um outro que traduz um valor booleano em uma string('Sim' e 'Não') para que o usuário possa entender o que esta sendo retornado.

&nbsp; &nbsp; &nbsp;Implementação da classe pai:



/**

&nbsp;* @author marco.bidoia@gmail.com

&nbsp;*

&nbsp;*/

public class Veiculo
{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String placa;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String cor;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int ano;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void Relatorio(){

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Placa: " + placa);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Cor: " + cor);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Ano:
" + ano);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String
getBooleanToStr(boolean valorBooleano){

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if
(valorBooleano){

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "Sim";

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "Não";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }

}





&nbsp; &nbsp; &nbsp;Agora vamos implementar a classe filha que herdara todos os atributos e métodos da classe Pai.

&nbsp; &nbsp; Observe que na primeira linha do método de Relatório usamos a seguinte linha "super.Relatorio();" para garantirmos que o que foi implementado na classe pais seja impresso antes do que tem na classe filha.



/**

&nbsp;* @author marco.bidoia@gmail.com

&nbsp;*

&nbsp;*/

public class Passeio extends Veiculo {

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int numPortas;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean direcaohidraulica;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void Relatorio(){

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super.Relatorio();

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Número
de portas: " + numPortas);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Direção
hidraulica: " + getBooleanToStr(direcaohidraulica));

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }

}



&nbsp; &nbsp; &nbsp;No método de Relatório anterior observe que para imprimir o valor booleano usamos um método chamado &nbsp;"getBooleanToStr(boolean)" que ao passarmos um valor boolean nos retorna "Sim"(True) ou "não"(False) &nbsp;para que o resultado fique legível aos usuários.





&nbsp; &nbsp; &nbsp;Aqui temos mais uma classe que herdou da mesma classe pai, mais que tem os atributos diferentes da outra classe filha. Mas também compartilha os atributos da classe pai e no método de relatório também utiliza o "super.Relatorio();" para imprimir os atributos da classe pai.



/**

&nbsp;* @author marco.bidoia@gmail.com

&nbsp;*

&nbsp;*/

public class Transporte extends Veiculo{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int capacidade;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String tipo;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void Relatorio(){

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super.Relatorio();

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Capacidade:
" + capacidade);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Tipo:
" + tipo);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

}





&nbsp; &nbsp; &nbsp;Agora vamos implementar a classe que vai consumir as duas classe filhas anteriores, e por herança a classe pai também. Observe que criamos dois objetos diferentes e alimentamos cada um com os valores necessários.

&nbsp; &nbsp; &nbsp;Após alimentar cada objeto chamamos o método que imprime os valores dos objetos.



/**

&nbsp;* @author marco.bidoia@gmail.com

&nbsp;*

&nbsp;*/

public class UsandoVeiculo {

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args){

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Veículo
de passeio

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Passeio Lancer = new Passeio();

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lancer.ano = 2012;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lancer.cor = "Prata";

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lancer.direcaohidraulica = true;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lancer.numPortas = 4;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lancer.placa = "ABC1234";

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lancer.Relatorio();

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("\n");

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Veículo de transporte

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Transporte Onibus = new Transporte();

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Onibus.ano = 2010;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Onibus.cor = "Verde";

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Onibus.tipo = "Urbano";

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Onibus.capacidade = 44;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Onibus.placa = "QWE0987";

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Onibus.Relatorio();

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }



}



O resultado da nossa aplicação será este:





Placa: ABC1234

Cor: Prata

Ano: 2012

Número de portas: 4

Direção hidraulica: Sim



Placa: QWE0987

Cor: Verde

Ano: 2010

Capacidade: 44

Tipo: Urbano