Fundamentos de Sobrecarga de Métodos
Parte da seção Programação Orientada a Objetos do Journey de Java da Coddy — lição 28 de 87.
Polimorfismo significa "muitas formas". Em Java, ele permite que objetos se comportem de maneira diferente com base no contexto. Uma forma de polimorfismo é a sobrecarga de métodos, também chamada de polimorfismo de tempo de compilação, porque o Java determina qual método chamar durante a compilação.
A sobrecarga de métodos permite definir múltiplos métodos com o mesmo nome, mas parâmetros diferentes. O compilador os distingue com base no número, tipo ou ordem dos parâmetros:
public class Calculator {
public int add(int a, int b) {
return a + b;
}
public int add(int a, int b, int c) {
return a + b + c;
}
public double add(double a, double b) {
return a + b;
}
}Quando você chama add(5, 3), o Java usa o primeiro método. Chamar add(5, 3, 2) aciona o segundo, e add(5.0, 3.0) invoca o terceiro. O compilador escolhe a versão correta com base nos argumentos que você fornece.
Observe que alterar apenas o tipo de retorno não é uma sobrecarga válida. A lista de parâmetros deve ser diferente:
// NÃO é uma sobrecarga válida - não irá compilar
public int getValue() { return 1; }
public double getValue() { return 1.0; } // Erro!Você já viu a sobrecarga antes com a sobrecarga de construtores. A sobrecarga de métodos segue as mesmas regras e oferece flexibilidade ao permitir que um único nome de método lide com diferentes cenários de entrada.
Desafio
FácilVamos construir um formatador de mensagens que demonstra a sobrecarga de métodos (method overloading) fornecendo várias maneiras de formatar mensagens. Você criará uma classe utilitária com vários métodos format sobrecarregados que lidam com diferentes cenários de entrada.
Você organizará seu código em dois arquivos:
MessageFormatter.java: Crie uma classe que forneça formatação de mensagem flexível por meio de métodos sobrecarregados. Seu formatador deve ter:- Um método
format(String message)que retorna a mensagem envolvida em colchetes:[message] - Um método
format(String message, int repeatCount)que retorna a mensagem repetida o número especificado de vezes, separada por espaços - Um método
format(String message, String prefix)que retorna a mensagem com o prefixo anexado:prefix: message - Um método
format(String message, String prefix, String suffix)que retorna:prefix: message (suffix)
- Um método
Main.java: Demonstre todos os quatro métodos sobrecarregados funcionando juntos. Você receberá quatro entradas: uma mensagem (String), uma contagem de repetição (int), um prefixo (String) e um sufixo (String). Crie um MessageFormatter e chame cada versão do métodoformat, imprimindo cada resultado em sua própria linha:- Primeiro, formate apenas com a mensagem
- Segundo, formate com a mensagem e a contagem de repetição
- Terceiro, formate com a mensagem e o prefixo
- Quarto, formate com a mensagem, o prefixo e o sufixo
Você receberá quatro entradas: o texto da mensagem, quantas vezes repeti-lo, uma string de prefixo e uma string de sufixo.
Por exemplo, se a mensagem for "Hello", a contagem de repetição for 3, o prefixo for "INFO" e o sufixo for "done", sua saída deve mostrar quatro versões formatadas diferentes da mesma mensagem, cada uma usando um método sobrecarregado diferente!
Folha de consulta
A sobrecarga de métodos permite que você defina múltiplos métodos com o mesmo nome mas parâmetros diferentes. Isso também é chamado de polimorfismo de tempo de compilação porque o Java determina qual método chamar durante a compilação.
O compilador distingue métodos sobrecarregados com base no número, tipo ou ordem dos parâmetros:
public class Calculator {
public int add(int a, int b) {
return a + b;
}
public int add(int a, int b, int c) {
return a + b + c;
}
public double add(double a, double b) {
return a + b;
}
}Ao chamar add(5, 3), o Java usa o primeiro método. Chamar add(5, 3, 2) aciona o segundo, e add(5.0, 3.0) invoca o terceiro.
Importante: Alterar apenas o tipo de retorno não é uma sobrecarga válida. A lista de parâmetros deve ser diferente:
// Sobrecarga NÃO válida
public int getValue() { return 1; }
public double getValue() { return 1.0; } // Erro!Experimente você mesmo
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Ler as entradas
String message = scanner.nextLine();
int repeatCount = Integer.parseInt(scanner.nextLine());
String prefix = scanner.nextLine();
String suffix = scanner.nextLine();
// TODO: Criar um objeto MessageFormatter
// TODO: Chamar format apenas com message e imprimir o resultado
// TODO: Chamar format com message e repeatCount e imprimir o resultado
// TODO: Chamar format com message e prefix e imprimir o resultado
// TODO: Chamar format com message, prefix, e suffix e imprimir o resultado
}
}
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