Objeto retornando dados repetidos

Olá!

Sou novato na programação, e estou tentando criar um PDV aqui, mas estou com um problema chato demais.
Seguinte…

Tenho a classe Produto:

public Produto(String nome, String dirImagem, int codigoBarras, double valorUni, UnMedida unMedida, ArrayList sabores) {
this.nome = nome;
codBarras = codigoBarras;
preço = valorUni;
medida = unMedida;
if (dirImagem == null) {
nomeImagem = “produto-padrao.jpg”;
} else {
nomeImagem = dirImagem;
}
if (sabores != null) {
this.sabores = sabores;
}
}

As variáveis

private static String nome, nomeImagem;
private static int codBarras;
private static double preço, quantidade;
private static UnMedida medida;
private static ArrayList<String> sabores;

Alguns métodos, porém para essa ajuda só preciso mostrar este

public static String getNome() {
    return nome;
}

Eu fiz este teste numa outra classe:

public static void main(String[] args){
    ArrayList<Produto> prodts = new ArrayList<>();
    System.err.println("Iniciando com " + produtos.size());
    Produto esf = new Produto("Esfirra", null, 10002, 17, UnMedida.KG, null);
    Produto nhoq = new Produto("Nhoque", null, 20003, 12, UnMedida.KG, null);
    Produto paoq = new Produto("Pão de queijo", null, 20004, 13, UnMedida.KG, null);
    Produto cook = new Produto("Cookies", "cookie.jpg", 20005, 20, UnMedida.KG, null);
    Produto frit = new Produto("Salgado frito", "00-coxinha.jpg", 10001, 30, UnMedida.CENTO, null);
    System.out.println(esf.getNome() + " " + esf.getCodBarras() + " " + esf.getPreço());
    prodts.add(esf);
    System.out.println(nhoq.getNome() + " " + nhoq.getCodBarras() + " " + nhoq.getPreço());
    prodts.add(nhoq);
    System.out.println(paoq.getNome() + " " + paoq.getCodBarras() + " " + paoq.getPreço());
    prodts.add(paoq);
    System.out.println(cook.getNome() + " " + cook.getCodBarras() + " " + cook.getPreço());
    prodts.add(cook);
    System.out.println(frit.getNome() + " " + frit.getCodBarras() + " " + frit.getPreço());
    prodts.add(frit);
    System.out.println("Todos adicionados");
}

E olha a merda que sai no console:

Iniciando com 0
Salgado frito 10001.0 30.0
Salgado frito 10001.0 30.0
Salgado frito 10001.0 30.0
Salgado frito 10001.0 30.0
Salgado frito 10001.0 30.0
Todos adicionados

Ou seja, não consigo criar diferentes produtos. Por que tá dando isso???
Quando eu crio a classe produto, o método principal seta corretamente os dados, eu fiz o debug pelo console, porém quando eu crio sempre sai igual a outra classe produto.

Obrigado!

Quando você cria os objetos da classe Produto :wink:

Você está criando diferentes objetos da classe Produto sim, veja:

Produto esf = new Produto("Esfirra", null, 10002, 17, UnMedida.KG, null);
Produto nhoq = new Produto("Nhoque", null, 20003, 12, UnMedida.KG, null);
Produto paoq = new Produto("Pão de queijo", null, 20004, 13, UnMedida.KG, null);
Produto cook = new Produto("Cookies", "cookie.jpg", 20005, 20, UnMedida.KG, null);
Produto frit = new Produto("Salgado frito", "00-coxinha.jpg", 10001, 30, UnMedida.CENTO, null);

A instrução new serve justamente para criar um novo objeto da classe.

O problema é que você declarou os atributos da classe Produto como sendo static.
Tudo que é estático pertence à classe e é compartilhado por todos os objetos.
Então quando você altera o valor de um atributo estático, aquele valor será o mesmo para todas os objetos daquela classe.
Remove o static dos atributos que vai funcionar.

2 curtidas

Talvez você precise entender o conceito de variável estática.
Elas pertencem a classe e são compartilhadas por todas as instâncias de objeto de uma determinada classe. No caso, quando você instancia um objeto de Produto

Produto esf = new Produto("Esfirra", null, 10002, 17, UnMedida.KG, null);

Está definindo que todas as instâncias de objeto da classe Produto terão aqueles valores ("Esfirra, null, 10002, 17, UnMedida.KG, null)
A partir do momento em que você cria os outros objetos, vai sobrepondo os valores anteriores, culminando com o resultado que está tendo.

Sugestão: remova o modificador static dos atributos.

1 curtida

Você sabia que o primeiro contato que sua pergunta tem com a comunidade se dá pelo título? Então, da próxima vez, tente sumarizar o problema no título, e não escrever que seu problema é tosco.

Leia aqui sobre como fazer uma boa postagem.

1 curtida

Agradeço pelas respostas!

Realmente não sei muito da teoria da linguagem, pois nunca fiz um curso, só fui pegando alguns códigos e fazendo os testes e indo kkkkk, aí com o tempo aprendi a fazer uns negócios legais.
Mas enfim, agradeço a ajuda de todos, e, peço desculpas pelo título do post, não sabia como esclarecer o problema no título.

Obrigado, boa noite.