Impressão arraylist 2 [RESOLVIDO]

Ola. tenho uma classe pai Seguro e 3 classes filhas. seguro carro, vida e imovel

tenho que adicionar por tipo de seguro em um arraylist e usando polimorfismo. Vou mostrar 1 classe e 1 metodo mas os outros 2 são identicos. mudando apenas as variaveis

no metodo seguro eu tenho um imprimeSeguro que é abstrato

na classe seguro carro

o metodo imprime ficou assim

public  String  imprimiSeguro()
  {
		  return   "Num:  " +  super.getNum() + "\n" +  "Nome: "+ super.getNome() + "\n" + "Valor: " + super.getValor() + "\n" + "Premio: " + super.getPremio() + "\n" + "Num Lic: " + getNumlic() + "\n" + "Deducao:" + getDedcar() + "\n" + "Estado origem: " + getEstado2() + "\n" + "Modelo: " +  getModelo() + "\n" +  "Ano: " + getAno() + "\n";
  }

na classe do main, eu criei o arraylist

List<Seguro> seg = new ArrayList<Seguro>();

e para adicionar tal tipo de seguro, foi utilizado o case. No caso para adicionar um seguro do tipo carro, ele pede os dados e no final (antes do break) eu faço isso

SeguroAuto sega = new SeguroAuto(num,nome,rua,cidade,estado,cep,valor,premio,numlic,dedcar, estado2,modelo,anomodel);
							seg.add(sega);

e no case imprimir ficou assim

for(Seguro s : seg) {
                              s.imprimiSeguro();
						  }

mas o mesmo não imprime nada. essa é minha duvida

tentei fazer um imprime sega.imprimeSeguro ele imprimia mas acho que não é o correto para arraylist

Posta ai o código da classe SeguroAuto e outras pra gente ver como está, assim fica mais fácil de ajudar.

Também acho que deveria remover o super, porque o super executa o método da superclasse e não da própria classe, tente deixar conforme abaixo.


public  String  imprimiSeguro()
  {
		  return   "Num:  " + getNum() + "\n" +  "Nome: "+ getNome() + "\n" + "Valor: " + getValor() + "\n" + "Premio: " + getPremio() + "\n" + "Num Lic: " + getNumlic() + "\n" + "Deducao:" + getDedcar() + "\n" + "Estado origem: " + getEstado2() + "\n" + "Modelo: " +  getModelo() + "\n" +  "Ano: " + getAno() + "\n";
  }

usei o super pois a classe seguro estão as variaveis em como num nome, end

classe seguro carro

public  class SeguroAuto extends Seguro
{

	private int numlic;
	private int dedcar;
	private String estado2;
	private String modelo ;
	private int ano;
	//Método Construtor
	public SeguroAuto (int num,String nome,String rua,String cidade,String estado,String cep, float valor, float premio,int numlic, int dedcar, String estado2, String modelo, int ano)
	{
		super (num,nome,rua,cidade,estado,cep,valor,premio);
		this.numlic=numlic;
		this.dedcar=dedcar;
		this.estado2=estado2;
		this.modelo=modelo;
		this.ano=ano;
	}

	public int getNumlic()
	 {
		return numlic;
	 }
	public void setNumlic (int numlic)
	 {
		this.numlic = numlic;
	 }
	public int getDedcar()
	 {
		return dedcar;
	 }
	public void setDedcar (int dedcar)
	 {
		this.dedcar = dedcar;
	 }
	public String getEstado2()
	 {
		return estado2;
	 }
    public void setEstado2 (String estado)
     {
		this.estado2 = estado2;
	 }
   	public String getModelo()
   	 {
   		return modelo;
   	 }
   public void setModelo (String modelo)
     {
   		this.modelo = modelo;
	 }
    public int getAno()
	 {
		return ano;
     }
    public void setAno (int ano)
	 {
			this.ano = ano;
	 }
  public  String  imprimiSeguro()
  {
		  return   "Num:  " +  super.getNum() + "\n" +  "Nome: "+ super.getNome() + "\n" + "Valor: " + super.getValor() + "\n" + "Premio: " + super.getPremio() + "\n" + "Num Lic: " + getNumlic() + "\n" + "Deducao:" + getDedcar() + "\n" + "Estado origem: " + getEstado2() + "\n" + "Modelo: " +  getModelo() + "\n" +  "Ano: " + getAno() + "\n";
  }

}//fim da classe

classe seguro PAI

public abstract class Seguro{

	private int num;
	private String nome;
	private Endereco endr;
	private float valor;
	private float premio;

	//Método Construtor
	    public Seguro (int num,String nome,String rua,String cidade,String estado,String cep, float valor, float premio){
		this.num=num;
		this.nome=nome;
		endr = new Endereco(rua,cidade,estado,cep);
		this.valor=valor;
		this.premio=premio;
	}

	//Método Get
	public int getNum(){
		return num;
	}

	//Método Set
	public void setNum (int num){
		this.num = num;
	}
	public String getNome(){
		return nome;
	}

	//Método Set
	public void setNome (String nome){
		this.nome = nome;
	}
	public Endereco getEnd(){
		return endr;
	}

	//Método Set
	public void setEnd (Endereco endr){
		this.endr = endr;
	}
	public float getValor(){
		return valor;
	}

	//Método Set
	public void setValor (float valor){
		this.valor = valor;
	}
	public float getPremio(){
		return premio;
	}

	//Método Set
	public void setPremio (float premio){
		this.premio = premio;
	}

	public abstract String  imprimiSeguro();

}//fim da classe

a classe pessoa e casa esta igual a de carro. só mudando o nome das variaveis.

o metodo pra imprimir no main usando o for esta correto?

Acho que entendi o seu problema, o metodo imprimiSeguro() não esta imprimindo porque ele é um metodo de retorno.

tente fazer o seguinte


for(Seguro s : seg) {
  System.out.println(s.imprimiSeguro());
}

ou mude para void o seu metodo já que só precisa imprimir e faça a impressão direto no próprio metodo.


public  void imprimiSeguro()
  {
		  System.out.println("Num:  " + getNum() + "\n" +  "Nome: "+ getNome() + "\n" + "Valor: " + getValor() + "\n" + "Premio: " + getPremio() + "\n" + "Num Lic: " + getNumlic() + "\n" + "Deducao:" + getDedcar() + "\n" + "Estado origem: " + getEstado2() + "\n" + "Modelo: " +  getModelo() + "\n" +  "Ano: " + getAno() + "\n");
  }

eu teria que passar algum parametro então?

aqui da esse erro

void’ type not allowed here
System.out.println(s.imprimiSeguro());

deixei do jeito que me falou

eu fiz assim

mudei o imprime la pra void. instanciei o objeto no começo do programa na classe principal e tirei o for no imprime e chamei os metodos

sega.imprimiSeguro();
segc.imprimiSeguro();

o primeiro pra imprimir carro e o segundo casa

só que se eu digito os dados de carro, no carro ele imprime certo, mas as variaveis em comum como nome premio valor etc saem no imprimi da casa tambem

é obrigatorio o uso do for?

Seguinte, para usar System.out.println(s.imprimiSeguro()); tem que manter o metodo imprimeSeguro(); retornando String.

Caso queira usar s.imprimiSeguro(); direto, então pode deixar void e fazer o println direto lá no metodo.

Tem sim que usar o for, senão como você vai iterar na lista ?

correto

deixei assim

o imprimSeguro na classe seguro ficou como void como me disse

o imprimeSeguro na classe seguro auto ficou

public  void imprimiSeguro()
   {
           System.out.println("Num:  " + getNum() + "\n" +  "Nome: "+ getNome() + "\n" + "Valor: " + getValor() + "\n" + "Premio: " + getPremio() + "\n" + "Num Lic: " + getNumlic() + "\n" + "Deducao:" + getDedcar() + "\n" + "Estado origem: " + getEstado2() + "\n" + "Modelo: " +  getModelo() + "\n" +  "Ano: " + getAno() + "\n");
  }

correto?

e na classe do main o imprime ficou

for(Seguro s : seg) {
							  s.imprimiSeguro();
								}

mas não sai nada.

Mudou para void também na classe Seguro ?

public abstract void imprimiSeguro(); 

sim

esta assim

public abstract void imprimiSeguro();

Cara, o ideal e você depurar esse seu código, e rever a execução do seu código, ao meu ver a orientação a objetos esta correta.

Verifica se seu programa está realmente passando no seu for.

vou faze-lo

muito obrigado

consegui aqui. erro de logica

para uma busca atraves de um numero de seguro, eu posso usar o mesmo esquema do for?

sim, exemplo


public Seguro encontraSeguro(int numero, List&lt;Seguro&gt; seg) {
        for(Seguro s : seg) {
		if (s.getNUmero() == numero) return s;
	}
        return null;//caso não encontrar
}

eu fiz diferente

System.out.println ("\nDigite o numero da licensa \n");  // implementar
							numb = Integer.parseInt(input.nextLine());
							for (Seguro ss : seg)
							{
							for (int i = 0; i< seg.size(); i++)
							{
								if (numb == ss.getNum())
								{
									ss.imprimiSeguro();
								}
								else
								{
									System.out.print ("Numero de licensa invalido");
								}
						    }
							}
							break;

ta funcionando, mas esta correto?

Não entendi porque fazer dois for desse jeito,

for (Seguro ss : seg); faz o mesmo que for (int i = 0; i< seg.size(); i++);

use um ou outro, fica errado usar um dentro do outro.

séria interessante mudar seu post para [RESOLVIDO], e e criar outros com outras dúvidas.