Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Dúvidas Polimorfismo/Métodos

Olá pessoal, estou com uma duvida em um codigo que estou efetuando. A ideia foi a seguinte: Uma classe mãe Produto recebendo nome, preço, seus respectivos getters e setters e o método toString(), três classes filhas CD, Livro e DVD também herdando o metódo toString() do Produto.

toString da classe mãe

   public String toString() {
        return "Nome: "+ getName()
                +String.format("\nPreço: R$%.2f",getPreco());
    }

toString das classes filhas

//CD
 @Override
    public String toString() {
        return super.toString() + "\nNumero de Faixas: " + NumeroFaixas;
    }

//Livro
@Override
    public String toString() {
        return super.toString()+ "\nAutor: " + autor;
    }

//DVD
 @Override
    public String toString(){
        return super.toString() + "\nDuração: " + duracao;
    }

Também criei uma classe CadastroProduto para o cadastro desses produtos

public class CadastroProduto {

    public void cadastroProduto(){
        {
            Scanner sc = new Scanner(System.in);
            Scanner sc2 = new Scanner(System.in);
            String nome, autor;
            int numeroFaixas, opcao;
            double preco, duracao;

            System.out.println("Insira a opção do produto a cadastrar\n1 - Livros\n2 - CD\n3 - DVD");

            opcao = sc.nextInt();
            switch (opcao){
                case 1:
                    Livro livro = new Livro();
                    System.out.println("Insira o nome do livro");
                    livro.setName(sc2.nextLine());
                    System.out.println();
                    System.out.println("Insira o preço do livro ");
                    preco = sc.nextDouble();
                    livro.setPreco(preco);
                    System.out.println("Insira o nome do autor");
                    autor = sc2.nextLine();
                    livro.setAutor(autor);
                    break;
                case 2:
                    CD cd = new CD();
                    System.out.println("Insira o nome do CD");
                    nome = sc2.nextLine();
                    cd.setName(nome);
                    System.out.println("Insira o preço do CD");
                    preco = sc.nextDouble();
                    cd.setPreco(preco);
                    System.out.println("Insira o número de faixas");
                    numeroFaixas = sc.nextInt();
                    cd.setNumeroFaixas(numeroFaixas);
                    break;
                case 3:
                    DVDs dvd =  new DVDs();
                    System.out.println("Insira o nome do DVD");
                    nome = sc2.nextLine();
                    dvd.setName(nome);
                    System.out.println("Insira o preço do DVD");
                    preco = sc.nextDouble();
                    System.out.println("Insira a duração do DVD");
                    duracao = sc.nextDouble();
                    break;
                default:
                    System.out.println("Opção inválida");
            }
        }
    }    
}

E por fim o main Loja

public class Loja {

    public static void main(String[] args) {

        Locale.setDefault(Locale.US);

        int[] vetor = new int[5];

        CadastroProduto CP = new CadastroProduto();

        for (int i = 0; i < vetor.length; i++){
            CP.cadastroProduto();
        }

        for (int i = 0; i < vetor.length; i++){
            System.out.println(CP);
        }

Porém o programa está retornando a referência ao imprimir (inclusive, a mesma referência para os produtos) e não as mensagens colocadas nos produtos. "CadastroProduto@2344fc66 CadastroProduto@2344fc66 CadastroProduto@2344fc66 CadastroProduto@2344fc66 CadastroProduto@2344fc66 "

Pensei que o toString() resolveria esse problema, podem me dar uma luz sobre esse detalhe da impressão e um feedback sobre a herança das classe?

2 respostas
solução!

Oie Bruno, tudo bem contigo?

O seu código não está funcionando como você imagina, pois primeiro que você não está registrando nada dentro do "Vetor", e segundo porque na hora do sysout, você está printando sempre o "cadastroProdutos" e não os produtos que você criou a partir do "switch-case".

Tive que fazer algumas mudanças na classe "CadastroProduto" e "Loja" para o seu código funcionar, segue as correções:

Classe "CadastroProduto":

    private ArrayList<Produto> produtos = new ArrayList(); // isso aqui funciona igual ao um Vetor, mas ele é "infinito", não existe necessidade de definir um tamanho


    public void cadastroProduto(){


            Scanner sc = new Scanner(System.in);
            Scanner sc2 = new Scanner(System.in);
            String nome, autor;
            int numeroFaixas, opcao;
            double preco, duracao;

            System.out.println("Insira a opção do produto a cadastrar\n1 - Livros\n2 - CD\n3 - DVD");

            opcao = sc.nextInt();
            switch (opcao){
                case 1:
                    Livro livro = new Livro();
                    System.out.println("Insira o nome do livro");
                    livro.setName(sc2.nextLine());
                    System.out.println();
                    System.out.println("Insira o preço do livro ");
                    preco = sc.nextDouble();
                    livro.setPreco(preco);
                    System.out.println("Insira o nome do autor");
                    autor = sc2.nextLine();
                    livro.setAutor(autor);
                    produtos.add(livro);    // adiciona o livro no vetor produtos
                    break;
                case 2:
                    CD cd = new CD();
                    System.out.println("Insira o nome do CD");
                    nome = sc2.nextLine();
                    cd.setName(nome);
                    System.out.println("Insira o preço do CD");
                    preco = sc.nextDouble();
                    cd.setPreco(preco);
                    System.out.println("Insira o número de faixas");
                    numeroFaixas = sc.nextInt();
                    cd.setNumeroFaixas(numeroFaixas);
                    produtos.add(cd); // adiciona o cd no vetor produtos
                    break;
                case 3:
                    DVDs dvd =  new DVDs();
                    System.out.println("Insira o nome do DVD");
                    nome = sc2.nextLine();
                    dvd.setName(nome);
                    System.out.println("Insira o preço do DVD");
                    preco = sc.nextDouble();
                    System.out.println("Insira a duração do DVD");
                    duracao = sc.nextDouble();
                    produtos.add(dvd); // adiciona o dvd no vetor produtos
                    break;
                default:
                    System.out.println("Opção inválida");
            }
        }

    public ArrayList<Produto> getProdutos() {    // faz o retorno do vetor declarado lá em cima
        return produtos;
    }

Classe "Loja":

public class Teste {

     public static void main(String[] args) {

            Locale.setDefault(Locale.US);


            CadastroProduto CP = new CadastroProduto();

            for (int i = 0; i < 2; i++){   // coloquei esse 2 só para o loop acontecer
                CP.cadastroProduto();
            }

            for (int i = 0; i < CP.getProdutos().size(); i++){      // esse CP.getProdutos().size() está pegando o tamanho do Vetor
                System.out.println(CP.getProdutos().get(i));     // e aqui a parte importante, esse CP.getProdutos().get(i) está pegando o valor que está em cada posição do número representado pelo "i"
            }

}
}

Caso tenha qualquer dúvida sobre o código acima é só mandar mensagem que estarei por aqui :)

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.Bons Estudos!

Olá Igor, muito obrigado. Ficou claro agora pra mim :) vlwww