JAVA – Entendendo Herança
JAVA – Endendendo Heranca (ou não)
NOTA: tive problemas no fim de semana e nao tive acesso a internet, estou digitando isso antes de dormir, eh meu aniversario e estou bebado, a possibilidade de conter erros aqui eh enorme!
Ola meninos e meninas, falaremos de um negocio muito interessante e util em orientacao a objetos, ele eh facil para quem entedeu a introducao a orientacao a objetos, e dificil para quem nao entendeu… hehehehehehe… mas depois que se aprende eh facil…
NOTA 2: Os arquivos usados na explicação da aula anterior estao ali na área de uploads em um arquivo compactado, junto tem um DOC com o nome Herança na Pratica, os códigos desse arquivo comtem erros, utilizem os arquivos .java para estudo, os meus codigos que postei aqui estao todos compilando, simplifiquei o maximo que pude para todos entenderem! depois de entenderem pulem para os do Andre que fica facil de captar as mensagens
Heranca! tchan tchan tchatchannnnnnnnnnn!!!!!!
Para esse artigo lembrem-se sempre das palavras extends e super()… grave-as muito bem.
Vamos comecar com uma breve historinha: nas aulas passadas vcs tinham que criar uma ligacao entre duas classes usando set e get correto?

A area marcada de azul cinza devia ser criada e instanciada no metodo principal, e todo mundo ficou se perguntando sobre a area que nao estava de azul, ela tinha algumas propriedades diferentes, que diferenciavam o veiculo de passeio do veiculo de carga… sendo assim todos usaram a imaginacao e arriscaram fazer de algum jeito os dois (passeio e carga)…
Apenas relembrando, get retorna valores para o metodo principal, set envia valores do metodo principal para o objeto criado com base em uma classe… meu Meu Deus que complicado! mas so parece (partindo do principio que esses exercicios sao bem basicos)…
Utilizando o conceito de heranca teremos no final do exercicio 4 arquivos.java, sendo que um sera a superclasse Veiculo.java, outro sera a sub classe Passeio.java, Carga.java e por ultimo, mas nao menos importante usaVeiculo.java.
As sub classes Passeio e Veiculo vao herdar todas as propriedades da classe Veiculo (aquela area azul cinza lembram), e nelas havera apenas as propriedades que as diferenciam uma das outras
Vejam agora um exemplo que eu fiz, um pouquinho mais simples do que o apresentado na aula passada:
Classe Veiculo
Esta classe possui todos aqueles atributos marcados em azul no desenho, e tambem os gets e os sets, assim como na classe Caneta lembram…
public class veiculo{
//encapsulamento da propriedades
private String placa;
private String marca;
private String modelo;
private int ano;
private double valorKmRodado;
private double kmInicial;
private double kmFinal;
private double valorLocacao;
//metodos set
public void setPlaca(String nPlaca){
placa = nPlaca;
}
public void setMarca(String vMarca){
marca = vMarca;
}
public void setModelo(String vModelo){
modelo = vModelo;
}
//calcula o valor da locacao
//Deve-se declarar uma variavel para receber o valor para ser retornado
//Nao utiliza-se get, pois isto e uma funcao
public double calculaValorLocacao(){
valorLocacao = (kmFinal-kmInicial)*valorKmRodado;
return valorLocacao;
}
}
Classe Passeio
Esta sim é chique, simples e funcional, a classe passeio eh uma extencao da nossa superclasse Veiculo note que eh compreensivel so de ler o tiulo da classe!
//note que na declaracao da classe esta escrito Passeio extends veiculo
//ou seja, passeio eh uma extensao da classe veiculo
public class Passeio extends veiculo{
//encapsulamos apenas as novas propriedades
private String arCondicionado;
private int numPortas;
//construtor herda as propriedades da classe veiculo
//lembrando que o construtor deve ter o mesmo nome da classe
//super() eh a nossa grande ferramenta que herda todas as propriedades de nossa super classe!
public Passeio(){
super();
}
//aqui voces jah sabem...
//metodos set
public void setArCondicionado(String vArCondicionado){
arCondicionado = vArCondicionado;
//se o valor digitado for s, a variavel recebe o valor Sim
if (vArCondicionado.equalsIgnoreCase("s")){
arCondicionado = "Sim";
}
//se o valor digitado for n, a variavel recebe o valor Nao
if (vArCondicionado.equalsIgnoreCase("n")){
arCondicionado = "Não";
}
}
public void setNumPortas(int vNumPortas){
numPortas = vNumPortas;
}
}
Classe Carga
Na classe carga a mesma coisa do que na passeio… notem que o meu esta diferente do que o do Andre, para ficar mais facil de compreender…
public class Carga extends veiculo{
private double capacidade;
//contrutor herda as propriedades da classe veiculo
public Carga(){
super();
}
//metodo set
public void setCapacidade(double vCapacidade){
capacidade = vCapacidade;
}
//metodo get
public double getCapacidade(){
return capacidade;
}
}
Classe usaVeiculo
A classe usa veiculo vai criar 2 objetos chamados passeio e carga (com letra minuscula) e vai enviar e receber dados para as sub classes que criamos a pouco
import java.util.*;
public class usaVeiculo{
public static void main (String args[]){
//instanciando a classe Scanner
Scanner e = new Scanner (System.in);
Scanner e2 = new Scanner (System.in);
//heranca, aqui crio dois objetos com base na classe veiculo
Passeio passeio = new Passeio();
Carga carga = new Carga();
//Declarando variaveis
String placa;
String marca;
String modelo;
int ano;
double valorKmRodado;
double kmInicial;
double kmFinal;
String arCondicionado;
int numPortas;
double capacidade;
int contador=1;
//Mensagem inicial
System.out.println("Bem vindo!nPor favor digite 1 para calcular a locação de um veiculo de passeio,n2 para calcular a locação de um veículo de carganou zero para sair.");
//Inicio do programa, enquanto nao for exibido um valor igual a 0, 1 ou 2 ele continua o laco
while (contador != 0){
}
A explicação foi clara??? Se sim otimo! Se nao, perguntem!
softwarelivrenow@gmail.com
twitter.com/tittao
Estarei enviando tbm os arquivos que o Andre apresentou ok?
NOTA 3: nao utilizo acentos em minhas postagens pq eu escrevo tudo isso no editor gedit do linux, e posto utilizando Windows aqui no trabalho, e essa belezinha do Bil Gates nao reconhece os caracteres especiais digitados no Linux… affee…
contador=e2.nextInt();
//se um valor diferente de 0, 1 ou 2 for digitado, o programa exibe uma mensagem de erro
while (contador < 0 || contador > 2){
System.out.println(“nERRO!nPor favor digite um número válido”);
System.out.println(“nn———————————–nDeseja realizar outro calculo?nnPor favor digite 1 para calcular a locação de um veiculo de passeio,n2 para calcular a locação de um veículo de carganou zero para sair.”);
contador = e2.nextInt();
}
//Cancela o programa
if (contador == 0){
System.out.println(“nFinalizado pelo usuário.”);
}
//calcula veiculo de passeio
if (contador == 1){
System.out.print(“nDigite a placa do veículo: “);
placa=e.nextLine();
passeio.setPlaca(placa);
System.out.print(“nDigite a marca do veículo: “);
marca=e.nextLine();
passeio.setMarca(marca);
System.out.print(“nDigite o modelo do veículo: “);
modelo=e.nextLine();
passeio.setModelo(modelo);
System.out.print(“nDigite o ano do veículo: “);
ano=e2.nextInt();
passeio.setAno(ano);
System.out.print(“nDigite o valor do KM rodado do veículo: “);
valorKmRodado=e2.nextDouble();
passeio.setKmRodado(valorKmRodado);
System.out.print(“nDigite o KM incial do veículo: “);
kmInicial=e2.nextDouble();
passeio.setKmInicial(kmInicial);
System.out.print(“nDigite o KM final do veículo: “);
kmFinal=e2.nextDouble();
while (kmFinal<=kmInicial){
System.out.print(“nO Km final nao pode ser menor ou igual ao Km inicialnPor favor digite novamente”);
kmFinal=e2.nextDouble();
}
passeio.setKmFinal(kmFinal);
System.out.print(“nO veiculo possui ar condicionado?: “);
arCondicionado=e.nextLine();
while (!(arCondicionado.equalsIgnoreCase(“s”)) && !(arCondicionado.equalsIgnoreCase(“n”))){
System.out.print(“nPor favor digite S ou N : “);
arCondicionado=e.nextLine();
}
passeio.setArCondicionado(arCondicionado);
System.out.print(“nDigite o numero de portas do veículo: “);
numPortas=e2.nextInt();
while ((numPortas<2) || (numPortas>5)){
System.out.print(“nNumero incorreto!nUm carro de passeio não possui menos de 2 portas,nnem mais do que 5 portas: “);
numPortas=e2.nextInt();
}
passeio.setNumPortas(numPortas);
System.out.print(“nn———————————nnInformacoes do veiculo de passeio:”);
System.out.print(“nnPlaca: “+passeio.getPlaca());
System.out.print(“nMarca: “+passeio.getMarca());
System.out.print(“nModelo: “+passeio.getModelo());
System.out.print(“nAno: “+passeio.getAno());
System.out.print(“nValor do kilometro rodado: RS “+passeio.getKmRodado());
System.out.print(“nKm incial: “+passeio.getKmInicial());
System.out.print(“nKm final “+passeio.getKmFinal());
System.out.print(“nAr condicionado: “+passeio.getArCondicionado());
System.out.print(“nPossui “+passeio.getNumPortas()+” portas”);
System.out.print(“nnO valor da locacao foi RS “+passeio.calculaValorLocacao());
}
//veiculo de carga
if (contador == 2){
System.out.print(“nDigite a placa do veículo: “);
placa=e.nextLine();
carga.setPlaca(placa);
System.out.print(“nDigite a marca do veículo: “);
marca=e.nextLine();
carga.setMarca(marca);
System.out.print(“nDigite o modelo do veículo: “);
modelo=e.nextLine();
carga.setModelo(modelo);
System.out.print(“nDigite o ano do veículo: “);
ano=e2.nextInt();
carga.setAno(ano);
System.out.print(“nDigite o valor do KM rodado do veículo: “);
valorKmRodado=e2.nextDouble();
carga.setKmRodado(valorKmRodado);
System.out.print(“nDigite o KM incial do veículo: “);
kmInicial=e2.nextDouble();
carga.setKmInicial(kmInicial);
System.out.print(“nDigite o KM final do veículo: “);
kmFinal=e2.nextDouble();
while (kmFinal<=kmInicial){
System.out.print(“nO Km final nao pode ser menor ou igual ao Km inicialnPor favor digite novamente: “);
kmFinal=e2.nextDouble();
}
carga.setKmFinal(kmFinal);
System.out.print(“nDigite a capacidade de carga do veículo: “);
capacidade=e2.nextDouble();
carga.setCapacidade(capacidade);
/*NOTA: para cada get, deve-se utilizar um print, nao sei porque mas da pau quando se
colocam 2 gets em um mesmo print, com JOptionPane funciona*/
System.out.print(“nn———————————nnInformacoes do veiculo de cargo:”);
System.out.print(“nnPlaca: “+carga.getPlaca());
System.out.print(“nMarca: “+carga.getMarca());
System.out.print(“nModelo: “+carga.getModelo());
System.out.print(“nAno: “+carga.getAno());
System.out.print(“nValor do kilometro rodado: RS “+carga.getKmRodado());
System.out.print(“nKm incial: “+carga.getKmInicial());
System.out.print(“nKm final “+carga.getKmFinal());
System.out.print(“nPossui capacidade de “+carga.getCapacidade()+” kilos para carga”);
System.out.print(“nnO valor da locacao foi RS “+carga.calculaValorLocacao());
}
System.out.println(“nn———————————–nDeseja realizar outro calculo?nnPor favor digite 1 para calcular a locação de um veiculo de passeio,n2 para calcular a locação de um veículo de carganou zero para sair.”);
}
}
//metodos get
public String getArCondicionado(){
return arCondicionado;
}
public int getNumPortas(){
return numPortas;
}
public void setAno(int vAno){
ano = vAno;
}
public void setKmRodado(double vKmRodado){
valorKmRodado = vKmRodado;
}
public void setKmInicial(double vKmInicial){
kmInicial = vKmInicial;
}
public void setKmFinal(double vKmFinal){
kmFinal = vKmFinal;
}
//metodos get
public String getPlaca(){
return placa;
}
public String getMarca(){
return marca;
}
public String getModelo(){
return modelo;
}
public int getAno(){
return ano;
}
public double getKmRodado(){
return valorKmRodado;
}
public double getKmInicial(){
return kmInicial;
}
public double getKmFinal(){
return kmFinal;
}
Comentários
3 Comentários em JAVA – Entendendo Herança
-
Dani
06/11/2009
12:13
-
Lilian
03/11/2009
16:23
OMG!
Eu não entendi bulufas disso aqui..quero dizer..entender eu entendi..mas será que eu consigo fazer isso sozinha?
isso é chato…aff
RiALTO hauahauh
Mas a explicação foi boa e deu pra clarear (só não deu muito porque eu to lendo correndo pra me arrumar pra faculdade =P)
Valeu ^^


09/11/2009
10:37