Problema em criar objeto

Ola, sou iniciante em Java e estou travando demais em um erro. O código é simples, já me disseram que roda no eclipse (windows), mas aqui no meu Linux, com ou sem Eclipse, dá sempre o seguinte erro:

java:21: error: non-static variable this cannot be referenced from a static context

Alguem sabe o que é isso??

package magnus;

public class JavaProject {

class Produto {

String nome;
double preco;
int quantidade;

void adicionar(int qtde) { quantidade += qtde; }

void remover(int qtde) { quantidade = quantidade - qtde; }

double total() { return preco * quantidade; }

public static void main(String[] args) {

Produto feijao = new Produto();
feijao.nome = "carioca";
feijao.preco = 8.2;
feijao.quantidade = 30;

System.out.println(feijao.quantidade);
feijao.remover(10);
System.out.println(feijao.quantidade);
}

}

}

Você declarou seu método main dentro da classe Produto, que está dentro da classe JavaProject.
Declara o main dentro da classe JavaProject.

1 curtida

Como já dito, o método main está dentro da classe Produto. Mas indo um pouco além…

Pra que criar a classe Produto dentro da classe JavaProject? Claro que existem usos legítimos para usar uma inner class (veja aqui, aqui, aqui e aqui), mas é algo que vc precisa analisar antes de sair fazendo.

Enfim, uma sugestão é colocar a classe Produto em seu próprio arquivo Produto.java. Ou, se for no mesmo arquivo, deixe-a fora da classe JavaProject (lembrando que um arquivo .java pode ter no máximo uma classe pública, então se precisar que Produto também seja pública, ela precisa estar em outro arquivo). Só crie inner classes onde fizer sentido, senão vc complica à toa a sua hierarquia de classes.


Outro ponto é esse trecho:

Além de não ser idiomático, não está implementando uma das principais funcionalidades do construtor, que é o de… construir a instância já contendo todos os dados necessários. Ou seja, poderia alterar o código para:

public class Produto {
    private String nome;
    private double preco;
    private int quantidade;
    // construtor já recebe todos os dados que precisa
    public Produto(String nome, double preco, int quantidade) {
        this.nome = nome;
        this.preco = preco;
        this.quantidade = quantidade;
    }

    public int getQuantidade() {
        return this.quantidade;
    }
    // etc... (demais métodos)
}

E para usá-la:

Produto feijao = new Produto("Feijão carioca", 8.2, 30);
System.out.println(feijao.getQuantidade());
feijao.remover(10);
System.out.println(feijao.getQuantidade());

Ou seja, já crio o produto com todos os dados necessários.

Ao fazer new Produto(), vc cria um produto sem nome, e com preço e quantidades iguais a zero (que é o valor default quando um campo numérico não é inicializado). Mas faz sentido ter um produto sem esses dados? Eu entendo que não, daí o construtor, que força que vc já crie o produto informando todos os dados.

Claro que depende de cada caso, dos requisitos, etc. Pode ser que exista alguma situação que vc não tem a quantidade ainda, por exemplo, e ela só vai ser definida depois, etc. Mas de forma geral, vc deve pensar em quais construtores fazem sentido, em vez de criar um vazio e depois setar cada campo manualmente.

1 curtida