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
nomeepreco. - Deve existir um atributo
static int quantidadeiniciado em 0. - O construtor deve incrementar
quantidadea cada criação. getQuantidade()deve serstatice 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
nomeeprecosão atributos de instância: cada produto tem os seus.private static int quantidade = 0;cria uma única variável na classe, compartilhada por todas as instâncias.- No construtor,
quantidade++é executado a cadanew Produto(...), contando todas as criações. getQuantidade()é declaradostaticporque lê um atributostatice não depende de um objeto específico.- No
main, criamos três produtos sem guardar referência e chamamosProduto.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
quantidadesemstatic: cada produto teria seu próprio contador começando em 0, e o total seria sempre 1. - Tentar acessar
nomedentro degetQuantidade(): métodosstaticnã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