Métodos Estáticos
Parte da seção Programação Orientada a Objetos do Journey de Java da Coddy — lição 16 de 87.
Assim como as variáveis estáticas pertencem à classe em vez das instâncias, os métodos estáticos também pertencem à própria classe. Você pode chamá-los sem criar um objeto.
Declare um método estático adicionando a palavra-chave static:
public class MathHelper {
public static int add(int a, int b) {
return a + b;
}
public static int multiply(int a, int b) {
return a * b;
}
}
// Chame sem criar um objeto
int sum = MathHelper.add(5, 3); // 8
int product = MathHelper.multiply(4, 2); // 8Métodos estáticos têm uma restrição importante: eles não podem acessar variáveis de instância ou métodos de instância diretamente. Como os métodos estáticos existem sem um objeto, não há uma referência this para trabalhar.
public class Counter {
private int count; // Variável de instância
private static int total; // Variável estática
public static void incrementTotal() {
total++; // OK - acessando variável estática
// count++; // Erro! Não é possível acessar variável de instância
}
}Métodos estáticos são ideais para operações utilitárias que não dependem do estado do objeto - pense em métodos como Math.sqrt() ou Integer.parseInt(). Eles fornecem funcionalidade que faz sentido no nível da classe em vez de para objetos individuais.
Desafio
FácilVamos construir uma classe utilitária StringUtils que fornece métodos úteis de manipulação de strings sem a necessidade de criar nenhum objeto - perfeito para demonstrar métodos estáticos!
Você criará dois arquivos para organizar seu código:
StringUtils.java: Crie uma classe utilitária com métodos estáticos que realizam operações comuns de string:- Um método estático
countVowels(String text)que retorna o número de vogais (a, e, i, o, u - tanto maiúsculas quanto minúsculas) na string fornecida - Um método estático
reverse(String text)que retorna a string invertida - Um método estático
isPalindrome(String text)que retornatruese a string for lida da mesma forma de frente para trás e de trás para frente (insensível a maiúsculas e minúsculas), efalsecaso contrário
- Um método estático
Main.java: Use sua classe utilitária para processar uma string. Você receberá uma entrada: uma string de texto. Chame cada método estático diretamente através do nome da classe e imprima três linhas:Vowels: [count]Reversed: [reversed string]Palindrome: trueouPalindrome: false
Você receberá uma entrada: uma string de texto para analisar.
Lembre-se de que os métodos estáticos são chamados usando o nome da classe (como StringUtils.countVowels(text)) em vez de criar uma instância primeiro. Isso torna as classes utilitárias convenientes para operações que não precisam manter nenhum estado entre as chamadas.
Folha de consulta
Métodos estáticos pertencem à própria classe e podem ser chamados sem a criação de um objeto. Declare-os usando a palavra-chave static:
public class MathHelper {
public static int add(int a, int b) {
return a + b;
}
}
// Chamada sem criar um objeto
int sum = MathHelper.add(5, 3); // 8Restrição importante: Métodos estáticos não podem acessar variáveis de instância ou métodos de instância diretamente, pois eles existem sem um objeto e não possuem uma referência this:
public class Counter {
private int count; // Variável de instância
private static int total; // Variável estática
public static void incrementTotal() {
total++; // OK - acessando variável estática
// count++; // Erro! Não é possível acessar variável de instância
}
}Métodos estáticos são ideais para operações utilitárias que não dependem do estado do objeto, como Math.sqrt() ou Integer.parseInt().
Experimente você mesmo
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String text = scanner.nextLine();
// TODO: Use os métodos estáticos de StringUtils para analisar o texto
// Chame StringUtils.countVowels(text) para obter a contagem de vogais
// Chame StringUtils.reverse(text) para obter a string invertida
// Chame StringUtils.isPalindrome(text) para verificar se é um palíndromo
// TODO: Imprima os resultados no formato:
// Vowels: [count]
// Reversed: [reversed string]
// Palindrome: true/false
}
}
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 Iterator