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

(link direto para o arquivo)

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

  1. Marcos Candia
    09/11/2009
    10:37
  2. OMG!

  3. Dani
    06/11/2009
    12:13
  4. Eu não entendi bulufas disso aqui..quero dizer..entender eu entendi..mas será que eu consigo fazer isso sozinha?
    isso é chato…aff

  5. Lilian
    03/11/2009
    16:23
  6. 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 ^^