Médio Java

Contador de instâncias com static

Enunciado

Crie uma classe Produto com os atributos nome e preco, um construtor que os receba e um atributo static chamado quantidade que conta quantos objetos Produto foram criados. Adicione um método static int getQuantidade() que retorne esse total. No main, crie três produtos e imprima a quantidade.

Requisitos

  • A classe deve ter os atributos de instância nome e preco.
  • Deve existir um atributo static int quantidade iniciado em 0.
  • O construtor deve incrementar quantidade a cada criação.
  • getQuantidade() deve ser static e retornar o total de produtos criados.

Código inicial

public class Produto {
    // atributos de instancia

    // atributo static

    // construtor

    // metodo static getQuantidade()

    public static void main(String[] args) {
        // crie tres produtos e imprima a quantidade
    }
}

Saída esperada

Quantidade de produtos: 3
Ver dica

Um atributo static existe uma única vez na classe; incrementá-lo no construtor conta todas as instâncias criadas.

Mostrar solução
public class Produto {
    private String nome;   // atributo de instancia
    private double preco;  // atributo de instancia

    // Atributo static: uma unica copia compartilhada por todos os objetos.
    private static int quantidade = 0;

    public Produto(String nome, double preco) {
        this.nome = nome;
        this.preco = preco;
        quantidade++; // incrementa o contador da classe
    }

    // Metodo static: pertence a classe, nao a um objeto especifico.
    public static int getQuantidade() {
        return quantidade;
    }

    public static void main(String[] args) {
        new Produto("Caneta", 2.50);
        new Produto("Caderno", 15.00);
        new Produto("Mochila", 80.00);

        // Chamado pela classe, nao por uma instancia.
        System.out.println("Quantidade de produtos: " + Produto.getQuantidade());
    }
}

Passo a passo

  1. nome e preco são atributos de instância: cada produto tem os seus.
  2. private static int quantidade = 0; cria uma única variável na classe, compartilhada por todas as instâncias.
  3. No construtor, quantidade++ é executado a cada new Produto(...), contando todas as criações.
  4. getQuantidade() é declarado static porque lê um atributo static e não depende de um objeto específico.
  5. No main, criamos três produtos sem guardar referência e chamamos Produto.getQuantidade() pela classe.

Por que funciona

Membros static pertencem à classe e são inicializados uma única vez quando a classe é carregada. Como o construtor roda a cada instância, ele é o lugar natural para atualizar o contador global. Chamar pelo nome da classe (Produto.getQuantidade()) deixa explícito que o valor é compartilhado.

Erros comuns

  • Declarar quantidade sem static: cada produto teria seu próprio contador começando em 0, e o total seria sempre 1.
  • Tentar acessar nome dentro de getQuantidade(): métodos static não podem acessar atributos de instância — gera erro de compilação.
  • Chamar getQuantidade() como método de instância: funciona, mas confunde; o correto é Produto.getQuantidade().

Outra forma de resolver

Se precisar de contagem thread-safe, use private static final AtomicInteger quantidade = new AtomicInteger(); e quantidade.incrementAndGet() no construtor — útil em programas concorrentes.

Saída esperada

Quantidade de produtos: 3