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, cada campo que criamos pertence a um objeto específico. Cada BankAccount tem seu próprio balance, e cada Product tem seu próprio name. Estas são variáveis de instância - elas existem separadamente para cada instância de uma classe.
Mas e se você precisar de dados que sejam 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 em particular.
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: 2Observe como acessamos a variável estática através do nome da classe (Student.getTotalCount()) em vez de através de um objeto. Isso enfatiza que 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 aluno). Use variáveis estáticas para dados que devem ser compartilhados (como contar quantos objetos existem).
Desafio
FácilVamos criar um sistema de inventário de Book que acompanha 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 acompanhe as informações individuais de cada livro e também mantenha a contagem de todos os livros já criados:- Uma variável de instância
title(String) - exclusiva para cada livro - Uma variável de instância
price(double) - exclusiva para cada livro - Uma variável estática
totalBooks(int) - compartilhada entre todos os objetos Book, acompanhando quantos livros foram criados - Um construtor que receba o título e o preço e incremente 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 retorne o número total de livros criados
- Uma variável de instância
Main.java: Crie vários objetos Book e demonstre como o contador estático acompanha 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]
- O título e o preço de cada livro no formato:
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 acessá-lo 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);
// Ler 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: Criar três objetos Book usando as entradas acima
// TODO: Imprimir 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: Imprimir o número total de livros usando o método estático
// Formato: Total books: [count]
// Lembre-se de acessar o método estático através do nome da classe: Book.getTotalBooks()
}
}
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
1Fundamentos de POO
Arquivos ExternosIntrodução à POOClasses vs ObjetosA Palavra-chave thisMétodosCampos (Atributos)Método ConstrutorSobrecarga de ConstrutorRecapitulação - Calculadora Simples4Herança
Herança Básica (extends)A Palavra-chave superSobrescrita de Método (@Override)Encadeamento de ConstrutoresA Classe ObjectHerança Simples e MultinívelPor que não há Herança Múltipla de ClassesRecapitulação - Hierarquia de Funcionários7Métodos Especiais e a Classe Object
Método toString()equals() e hashCode()Método clone()compareTo() e ComparableInterface ComparatorRecapitulação - Ordenação Personalizada2Modificadores de Acesso e Encapsulamento
Visão Geral dos Níveis de AcessoMétodos Getter e SetterOcultação de InformaçõesA Palavra-chave finalRecapitulação - Gerenciador de Conta Bancária5Polimorfismo
Fundamentos de Sobrecarga de MétodosSobrescrita de Métodos (Tempo de Execução)Upcasting e DowncastingO Operador instanceofClasses e Métodos AbstratosRecapitulação - Calculadora de Formas8Conceitos Avançados de OOP
Composição vs HerançaAgregação vs ComposiçãoClasses Internas, Aninhadas e AnônimasEnums e Métodos de EnumRecords (Java 16+)Classes Seladas (Java 17+)11Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão BuilderPadrão ObserverPadrão Strategy3Propriedades de Classe e Membros Estáticos
Variáveis de Instância vs EstáticasMétodos EstáticosBlocos EstáticosConstantes (static final)Recapitulação - Contador e Utilitário6Interfaces e Classes Abstratas
Introdução às InterfacesImplementando InterfacesImplementação de Múltiplas InterfacesDefault e Static em InterfacesClasses Abstratas vs InterfacesInterfaces FuncionaisRecapitulação - Sistema de Pagamento9Generics
Introdução a GenericsClasses GenéricasMétodos GenéricosParâmetros de Tipos DelimitadosWildcards (?, extends, super)Recapitulação - Container Genérico12Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão IteratorPratique por conta própria: Compilador de Java online