Sou novo no fórum e estou iniciando na programação Java. Estou fazendo um curso básico do site T2ti, só que “travei” em um dos exercícios. Este exercício, 04 do Módulo 07, pede-se o seguinte: Crie uma classe Zoologico, com 10 jaulas (utilize um array) coloque em cada jaula um animal diferente, percorra cada jaula e emita o som e, se o tipo de
animal possuir o comportamento, faça-o correr.[b].
Eu criei a classe Zoologico, e adicionei um metodo criarJaula(), e neste metodo ja coloquei cada animal em um indice.
Só que minha dúvida é a seguinte: Criei uma classe MainExercicio04, e atraves dela eu queria percorrer o array da classe Zoologico, conforme pede o exercicio, mas utilizando o Polimorfismo. Já tentei de várias maneiras, mas sempre ocorre erro de compilação.
Agora o MainExercicio04 para conseguir ler a classe Zoologico ficou conforme abaixo:
public class MainExercicio04
{
public static void main(String[] args)
{
Zoologico percorreJaula = new Zoologico;
Zoologico[] percorrerJaula = percorreJaula.criarJaula(jaula);
percorreJaula = percorrerJaula.criarJaula();
for(int i = 0; i < percorreJaula.length; i++)
{
percorreJaula = percorrerJaula.criarJaula();
System.out.println(percorreJaula.criarJaula[i]);
}
}
Desculpe, sei que o código não está legal, mas esta foi a última vez que tentei mexer no código, tentei de várias outras maneiras mas não consegui. Lembrando que as classes referentes aos animais estão todas criadas também.
Bom, seu código ficou meio bagunçado, e isso pode ser o que te impede de ver a solução.
Eu recomendo você criar as classes para cada entidade do seu exercício. Tente seguir o modelo abaixo, e complemente com o que precisar.[code]class Zoologico{
Jaula[] jaulas;
//Getters, Setters e outros métodos
}
class Jaula{
Animal animal;
//Getters, Setters e outros métodos
[quote=JonFF]Magostta, vou modificar a classe Zoologico, e as classes dos animais estão com extend Animal sim.
Vou tentar fazer tambem o que o digaoneves disse, porque acho que o mais dificil será conseguir ler o array da classe MainExercicio04…
Vou fazer o teste e posto o retorno aqui…
Obrigado.[/quote]
Faça as coisas bem separadas, o array não pertence à classe MainExercicio04, e sim ao Zoológico. Se você dividir bem as responsabilidades, vai ver que tudo fica mais fácil de ler e de programar.
Digaoneves e Magostta, deu certo. Queria agradecê-los pela ajuda. Vou postar o código abaixo, compilei e testei e deu certo, agora se tiver algo que possa melhorar, por favor me avisem:
public class Zoologico
{
public void criarJaula()
{
Animal[] jaula = new Animal[5];
jaula[0] = new Camelo();
jaula[1] = new Elefante();
jaula[2] = new Leao();
jaula[3] = new Girafa();
jaula[4] = new Preguica();
}
}
public class MainExercicio04
{
/**
* @param args
*/
public static void main(String[] args)
{
Animal animal = criarAnimal(args[0]);
animal.emitirSom();
animal.correr();
}
public static Animal criarAnimal(String tipo)
{
if(tipo == null)
{
return new Camelo();
}
else if(tipo.equals("Camelo"))
{
return new Camelo();
}
else if(tipo.equals("Preguica"))
{
return new Preguica();
}
else if(tipo.equals("Elefante"))
{
return new Elefante();
}
else if(tipo.equals("Leao"))
{
return new Leao();
}
else if(tipo.equals("Girafa"))
{
return new Girafa();
}
return new Preguica();
}
}
E tem as outras classes dos 5 animais, que coloquei 2 métodos em cada 1. emitirSom() e correr(), com excessão do Preguica(), que tem os métodos emitirSom() e SubirEmArvores().
Você ainda não consegue percorrer a lista de animais. Crie um metodo get para isso
public class Zoologico
{
Animal[] jaula = new Animal[5];
public void criarJaula()
{
jaula[0] = new Camelo();
jaula[1] = new Elefante();
jaula[2] = new Leao();
jaula[3] = new Girafa();
jaula[4] = new Preguica();
}
public Animal[] getArrayAnimais(){
return jaula;
}
}
Magostta, fiz a modificação e a principio ele faz a leitura dos Arrays perfeitamente. Porém quando tento fazer com que ele leia pelo MainExercicio04, via argumento ele pula direto para última linha o return new Preguica();
Fiz apenas um deles, o do Camelo para exemplo. O que está errado agora?
public class MainExercicio04
{
/**
* @param args
*/
public static void main(String[] args)
{
Animal animal = criarAnimal(args[0]);
animal.emitirSom();
animal.correr();
}
public static Animal criarAnimal(String tipo)
{
Zoologico zoologico = new Zoologico();
zoologico.criarJaula();
if(tipo == null)
{
return new Camelo();
}
else if(tipo.equals("Camelo"))
{
for(int i = 0; i < zoologico.jaula.length; i++)
{
if(zoologico.jaula[i].equals("Camelo"))
{
return new Camelo();
}
}
}
else if(tipo.equals("Preguica"))
{
return new Preguica();
}
else if(tipo.equals("Elefante"))
{
return new Elefante();
}
else if(tipo.equals("Leao"))
{
return new Leao();
}
else if(tipo.equals("Girafa"))
{
return new Girafa();
}
return new Preguica();
}
}
Agora consegui fazer, o único problema é que só está dando certo se eu colocar como parâmetro a palavra “Camelo”, ele só está fazendo o índice 0. Se eu colocar outro animal ele não faz a condição. O que pode estar acontecendo? Abaixo segue o código:
public class MainExercicio04
{
/**
* @param args
*/
public static void main(String[] args)
{
Animal animal = criarAnimal(args[0]);
animal.emitirSom();
animal.correr();
}
public static Animal criarAnimal(String tipo)
{
Zoologico zoologico = new Zoologico();
zoologico.criarJaula();
if(tipo.equals("Camelo"))
{
for(int i = 0; i < zoologico.jaula.length; i++)
{
if(zoologico.jaula[i].getNome().equals("Camelo"))
{
return new Camelo();
}
else if(zoologico.jaula[i].getNome().equals("Elefante"))
{
return new Elefante();
}
else if(zoologico.jaula[i].getNome().equals("Leao"))
{
return new Leao();
}
else if(zoologico.jaula[i].getNome().equals("Girafa"))
{
return new Girafa();
}
else if(zoologico.jaula[i].getNome().equals("Preguica"))
{
return new Preguica();
}
}
}
return new Cavalo();
}
}
Acontece que no seu método você tem um if que verifica se é igual a “Camelo” antes de entrar no seu for.
sinceramente, esse método ficou estranho.
Pense dessa maneira, não é a melhor, mas é mais simples.
Você só tem 10 jaulas, certo? portanto mantenha um contador na sua classe Zoologico, iniciado em 0, se alguém adicionar um animal, você adiciona no índice do contador, e depois o incrementa, se o contador passar do valor máximo, você não permite mais inserções.
Eu só não gostei muito desse seu método criarJaula(), ao meu ver um método com esse nome não deveria fazer nada além de construir o array.
É muito importante você fazerem métodos simples, que possuem apenas uma responsabilidade, e que tem um nome bem descritivo.
Um método bom é um método que faz uma coisa só e a faz bem, se você percebe que está com dificuldades para definir o nome do método, provavelmente ele está fazendo mais do que deveria.
Utilizar métodos pequenos ajuda muito no reaproveitamento do código.
Outro detalhe, não permita que membros da sua classe sejam acessados diretamente, procure usar getters e setters, ou métodos de lógica de negócio, o encapsulamento é muito importante.
Então, sobre o Encapsulamento eu fiz sim. Utilizei os getters e seters em todos as classes. Agora sobre a questão do criarJaula() ele é justamente e apenas para fazer a criação das jaulas e colocar os animais dentro delas. Abaixo segue o código do Zoologico para você ver:
public class Zoologico
{
Animal[] jaula = new Animal[5];
public void criarJaula()
{
jaula[0] = new Camelo();
jaula[1] = new Elefante();
jaula[2] = new Leao();
jaula[3] = new Girafa();
jaula[4] = new Preguica();
}
public Animal[] getArrayAnimais()
{
return jaula;
}
}
Eu entendi o que o método faz, e entendi o motivo de você ter criado ele desse jeito, mas qual o problema nisso?
O problema é que eu só sei o que o método faz porque eu li o código, isso geralmente não é bom.
É sempre bom você conseguir deduzir o que um método faz pela assinatura.
E quanto ao encapsulamento:for(int i = 0; i < zoologico.jaula.length; i++){
zoologico.jaula[i].emitirSom();
zoologico.jaula[i].correr();
}Cadê ele aqui?
zoologico.getJaulas()[i].emitirSom();Pode parece bobo, e realmente não é a melhor maneira de implementar encapsulamento nesse caso… mas desenvolver buscando proteger os atributos da sua classe é importante.
Entendi digaoneves, muito obrigado pelas explicações.
Agora só para terminar, sobre os métodos que você havia dito, seria somente melhorar a renomeação deles mesmos, para ficar mais claro o entendimento, certo?