Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Array de objetos polimorfos

Preciso fazer um array onde todos os veículos que o usuário cadastre devem ser guardados em um único vetor (no caso os veículos seriam automóveis, caminhões e motos e cada um deles seriam classes diferentes que estendem uma classe chamada veiculo), utilizando o polimorfismo. Código da classe main

do {
            System.out.println("Digite o tipo do veiculo");
            String tipoVei = leia.next();
            Veiculo v1 = new Veiculo(tipoVei, nmSerie);
            veiculos.add(v1);
            System.out.println("Gostaria de cadastrar mais veiculos? s ou S para sim.");
            controle = leia.next().charAt(0);

        }while(controle == 's' || controle == 'S');

        for(int i=0; i<veiculos.size(); i++) {
            System.out.println(veiculos);

Classe Veiculos

public  class Veiculo {
    private String tipo;




    //Contrutor
    public Veiculo(String tipoVei, int nmSeri) {
        this.setTipo(tipoVei);


    }
    //Getters e Setters
    public String getTipo() {
        return tipo;
    }

    public void setTipo(String tipo) {
        this.tipo = tipo;
    }



    //Métodos...................

    @Override
    public String toString() {
        return "Tipo do veiculo: " + this.getTipo() +;
    }
}

Classe Automovel

public class Automovel extends Veiculo {

    public Automovel(String tipoVei) {
            super(tipoVei);
            super.setTipo("Automovel");
    }

}

Porém estou com dificuldades na hora de aplicar o polimorfismo e utilizar o vetor.

1 resposta
solução!

Oie Erik, tudo bem contigo?

Adaptei o seu código e apliquei polimorfismo tanto na criação dos objetos quanto na array, segue abaixo:

Classe teste:

public class Teste {

    public static void main(String[] args){
        ArrayList<Veiculo> veiculos = new ArrayList<>(2);
        Scanner leia  = new Scanner(System.in);
        char controle;
        Veiculo veiculo = null;        

        do {
            System.out.println("Digite o tipo do veiculo");
            String tipoVei = leia.next(); // Deve digitar "Automovel", "Moto" ou "Caminhao" dessa forma, se for de outr jeito dará execption

            Class classe = null;

            try {
                classe = Class.forName(tipoVei); 
                veiculo = (Veiculo) classe.newInstance(); // Cria uma nova instancia da classe indicada pelo "Class.forName()" com referência de "Veiculo".
                System.out.println(veiculo.toString());

            } catch (Exception e) {
                e.printStackTrace();
            }

            veiculos.add(veiculo);
            System.out.println("Gostaria de cadastrar mais veiculos? s ou S para sim.");
            controle = leia.next().charAt(0);

        } while(controle == 's' || controle == 'S');

        System.out.println(veiculos);
    }
}

Classe Veiculo:

public class Veiculo {

    @Override
    public String toString() {
        return "Tipo: ";
    }
}

Classe automovel:

public class Automovel extends Veiculo{

    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return super.toString() +  "automovel";
    }
}

Classe moto:

public class Moto extends Veiculo{

    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return super.toString() + "moto";
    }
}

Classe Caminhao:

public class Caminhao extends Veiculo{

    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return super.toString() + "caminhao";
    }

}

Importante, para funcionar desse jeito que eu fiz as classes devem estar todas no mesmo pacote caso ao contrário você vai ter que por o caminho correto como argumento dentro do "Class.forName(caminho + nomeDoTipo). Outra coisa, os nomes do tipo sempre devem ser digitados desse jeito: "Moto", "Automovel", "Caminhao". Se não for desse jeito irá dar Exception.

Qualquer dúvida sobre o código fico a disposição!

Bons estudos :)