Carregando...

Sobrecarga em Java

Coloque numa classe dois métodos que usem ambos o nome paint. Um cabeçalho é static void paint(String word). O outro é static void paint(int n). Os corpos são curtos: o primeiro imprime word, o segundo imprime n. Em main chame paint("ok"); e depois paint(3);. O ecrã deve mostrar duas linhas: ok na primeira e 3 na segunda. Java não trata o segundo paint como um choque. Vê os dois cabeçalhos como métodos diferentes porque as listas de parâmetros diferem. Esse nome partilhado com listas diferentes é o que esta página ensina.

Mesmo nome, listas diferentes

Até agora cada ideia nova usava um nome de método fresco: ring, greet, twice. Aqui o nome fica paint de propósito. O que muda é o que fica entre os parênteses. Uma lista guarda um String. Outra guarda um int. O compilador mantém os dois porque essas listas não são iguais.
Crie um ficheiro de programa pequeno chamado Sign.java. O public class da primeira linha deve coincidir com o nome do ficheiro: public class Sign. Não deixe um nome de classe antigo Box ou Tip neste ficheiro; o compilador espera que o nome da classe e o do ficheiro coincidam.
Fora de main, ainda dentro das chavetas da classe, escreva ambos os cabeçalhos paint. Nesta página mantenha void: cada corpo imprime e nada precisa de voltar a main por return. O primeiro corpo usa System.out.println(word);. O segundo usa System.out.println(n);. Guarde o ficheiro antes de compilar. O primeiro programa completo está na caixa seguinte.

Sign.java com dois métodos paint

Esta é a versão que você compila primeiro. main tem duas chamadas. A classe tem dois métodos paint que partilham o nome.

paint String and paint int

java
public class Sign {
    public static void main(String[] args) {
        paint("ok");
        paint(3);
    }

    static void paint(String word) {
        System.out.println(word);
    }

    static void paint(int n) {
        System.out.println(n);
    }
}

Na pasta que guarda Sign.java, execute javac Sign.java. Quando parênteses, chavetas e ponto e vírgula coincidem, javac não escreve uma linha própria. Depois execute java Sign — não java Sign.java. Tire a terminação .java do segundo comando. Os mesmos dois comandos funcionam no Windows e no macOS. O programa deve imprimir duas linhas e parar: ok e depois 3. Não deve pedir que você digite. Se o terminal esperar entrada do teclado, ainda há uma chamada nextLine de um exercício antigo. Apague-a e mantenha as duas chamadas paint mais os dois métodos paint acima.
Percorra a execução uma vez por ordem. Java começa em main. A primeira chamada é paint("ok"). O argumento é um String, por isso Java corre o corpo que recebe String word e imprime ok. A segunda chamada é paint(3). O argumento é um int, por isso Java corre o corpo que recebe int n e imprime 3. O nome paint é o mesmo as duas vezes. A lista entre parênteses é o que escolhe o corpo.
Se as duas linhas mostrarem ok, talvez tenha deixado só o método String e impresso uma palavra fixa em cada chamada. Se as duas mostrarem 3, talvez tenha deixado só o método int. Mantenha ambos os cabeçalhos. Se javac disser que paint já está definido, verifique se ambos os cabeçalhos têm a mesma lista — por exemplo duas cópias de paint(String word). Sobrecarga precisa de uma diferença real na lista, não de uma segunda cópia do mesmo cabeçalho só com outro nome de parâmetro.

Uma segunda lista com duas palavras

O número de parâmetros também pode diferir. Acrescente uma terceira sobrecarga que receba dois valores String e os imprima numa linha com um espaço. Deixe os dois primeiros métodos paint no sítio. Chame a nova forma a partir de main depois das chamadas anteriores, ou comece um main novo focado nesta forma enquanto a aprende.

paint two Strings

java
public class Sign {
    public static void main(String[] args) {
        paint("hi", "sam");
    }

    static void paint(String a, String b) {
        System.out.println(a + " " + b);
    }
}

Compile e execute de novo depois de guardar: javac Sign.java, depois java Sign. O ecrã deve mostrar uma linha: hi sam. A chamada tem dois argumentos. O método tem dois parâmetros. Essa correspondência basta para Java escolher este corpo. Se ainda tiver paint(String word) e paint(int n) na mesma classe, pode mantê-los. Uma chamada com dois valores String não escolhe o método String de um argumento, porque as quantidades diferem.
Quando colocar as três sobrecargas num ficheiro para praticar, main pode chamar cada forma na sua própria linha. Uma chamada com um String continua a ir para paint(String word). Uma chamada com um int continua a ir para paint(int n). Uma chamada com dois String vai para paint(String a, String b). O nome partilhado não apaga essas distinções.

Lista vazia ao lado de uma lista String

Um método com parênteses vazios também é uma lista diferente. Você pode manter paint() sem parâmetros ao lado de paint(String word). A chamada vazia paint(); corre o corpo de lista vazia. A chamada paint("go"); corre o corpo String.

paint empty and paint String

java
public class Sign {
    public static void main(String[] args) {
        paint();
        paint("go");
    }

    static void paint() {
        System.out.println("ready");
    }

    static void paint(String word) {
        System.out.println(word);
    }
}

Depois de javac Sign.java e java Sign, o ecrã deve mostrar ready na primeira linha e go na segunda. A primeira chamada não tem nada entre os parênteses, por isso encaixa em paint(). A segunda envia um String, por isso encaixa em paint(String word). Renomear um para paintReady também compilaria, mas isso é outra habilidade. Esta página mantém o nome paint e deixa as listas carregarem a diferença.

Que chamada corre que cabeçalho

Leia as chamadas ao lado dos cabeçalhos. A lista de argumentos na chamada deve encaixar na lista de parâmetros do cabeçalho. Nesta forma de principiante, o tipo e a quantidade importam.

📊 call beside matching paint

Chamada em main Cabeçalho que corre Linha no ecrã
paint("ok"); paint(String word) ok
paint(3); paint(int n) 3
paint("hi", "sam"); paint(String a, String b) hi sam
paint(); paint() ready

Um erro comum é escrever dois métodos que digam ambos paint(String word) e esperar que o segundo conte como sobrecarga. Só mudar o nome do parâmetro para paint(String label) não cria uma lista nova para o compilador. Aqui importam o tipo e a quantidade. Outro erro é chamar paint(true) quando nunca escreveu uma lista de parâmetros boolean. Então javac não encontra um paint que encaixe. Acrescente um cabeçalho que receba o tipo que quer, ou mude a chamada para um tipo que já suporte.
Escrever System.out.println("paint"); em main imprime a palavra paint. Não chama nenhum método. Mantenha paint("ok"); quando quiser a sobrecarga que recebe um String. Deixar um twice sobrante de um ficheiro Box antigo em Sign.java pode confundir o ecrã se main ainda imprimir twice(7). Limpe main até às chamadas paint que está a testar, e mantenha só as sobrecargas paint necessárias para essa execução.
Não aninhe um método paint dentro das chavetas de main. Os métodos ficam dentro da classe, ao lado de main. Duas sobrecargas são dois métodos irmãos nesse mesmo corpo de classe.

Antes de scope

Você pode manter um nome de método e várias listas de parâmetros na mesma classe. Java escolhe o corpo pela lista de argumentos da chamada. O ecrã mostra a linha do corpo que encaixa. Dois cabeçalhos com a mesma lista não são sobrecargas. A página seguinte é scope; lá você vê quais nomes são visíveis dentro de um método e quais ficam de fora.

🧠 Teste Seu Conhecimento

Pronto para Começar

Teste Seu Conhecimento

Desafie-se com este questionário interativo e veja o quão bem você entende o tópico

❓
5
Perguntas
🎯
70%
Para Passar
♾️
∞
Tempo
🔄
∞
Tentativas

📝 Instruções

  • Leia cada pergunta cuidadosamente
  • Selecione a melhor resposta para cada pergunta
  • Você pode refazer o quiz quantas vezes quiser
  • Seu progresso será mostrado no topo