Menu
CoddyTech

Variáveis de Instância vs Estáticas

Parte da seção Programação Orientada a Objetos do Journey de Java da Coddy. Lição 15 de 87.

Até agora, todos os campos que criamos pertencem a um objeto específico. Cada BankAccount tem seu próprio balance, e cada Product tem seu próprio name. Essas são variáveis de instância — elas existem separadamente para cada instância de uma classe.

Mas e se você precisar de dados compartilhados entre todos os objetos? É aí que entram as variáveis estáticas (também chamadas de variáveis de classe). Uma variável estática pertence à própria classe, não a nenhum objeto específico.

public class Student {
    private String name;           // Variável de instância - única por aluno
    private static int totalCount; // Variável estática - compartilhada por todos os alunos
    public Student(String name) {
        this.name = name;
        totalCount++;  // Incrementa o contador compartilhado
    }
    public static int getTotalCount() {
        return totalCount;
    }
}

Quando você cria vários estudantes, cada um tem seu próprio name, mas todos compartilham o mesmo totalCount:

Student s1 = new Student("Alice");
Student s2 = new Student("Bob");
System.out.println(Student.getTotalCount());  // Saída: 2

Observe como acessamos a variável estática por meio do nome da classe (Student.getTotalCount()), em vez de por meio de um objeto. Isso enfatiza que os membros estáticos pertencem à classe, não às instâncias.

Use variáveis de instância para dados que variam entre objetos (como o nome de um estudante). Use variáveis estáticas para dados que devem ser compartilhados (como contar quantos objetos existem).

challenge icon

Desafio

Fácil

Vamos criar um sistema de inventário de Book que rastreia tanto os detalhes de cada livro quanto o número total de livros em toda a sua coleção usando variáveis de instância e estáticas.

Você criará dois arquivos para organizar seu código:

  • Book.java: Crie uma classe Book que rastreie as informações individuais dos livros e também mantenha a contagem de todos os livros já criados:
    • Uma variável de instância title (String) - exclusiva de cada livro
    • Uma variável de instância price (double) - exclusiva de cada livro
    • Uma variável estática totalBooks (int) - compartilhada entre todos os objetos Book, rastreando quantos livros foram criados
    • Um construtor que recebe o título e o preço e incrementa a contagem total de livros
    • Um getter getTitle() para o título
    • Um getter getPrice() para o preço
    • Um método estático getTotalBooks() que retorna o número total de livros criados
  • Main.java: Crie vários objetos Book e demonstre como o contador estático rastreia todas as instâncias. Você receberá três títulos de livros e três preços como entradas. Depois de criar os três livros, imprima quatro linhas:
    • O título e o preço de cada livro no formato: [title]: $[price] (preço formatado com 2 casas decimais)
    • O número total de livros usando o método estático: Total books: [count]

Você receberá seis entradas na seguinte ordem: title1, price1, title2, price2, title3, price3.

Lembre-se de acessar o método estático por meio do nome da classe (Book.getTotalBooks()), em vez de por meio de uma instância de objeto. Para formatar os preços, use String.format("%.2f", price).

Experimente você mesmo

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Leia as entradas para três livros
        String title1 = scanner.nextLine();
        double price1 = Double.parseDouble(scanner.nextLine());
        String title2 = scanner.nextLine();
        double price2 = Double.parseDouble(scanner.nextLine());
        String title3 = scanner.nextLine();
        double price3 = Double.parseDouble(scanner.nextLine());
        
        // TODO: Crie três objetos Book usando as entradas acima
        
        // TODO: Imprima o título e o preço de cada livro no formato: [title]: $[price]
        // Use String.format("%.2f", price) para formatar o preço com 2 casas decimais
        
        // TODO: Imprima o número total de livros usando o método estático
        // Format: Total books: [count]
        // Lembre-se de acessar o método estático através do nome da classe: Book.getTotalBooks()
    }
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de Java online