Parâmetros permitem que um método receba entradas
Um método que sempre faz a mesma coisa é limitado. Parâmetros são as entradas que você declara dentro dos parênteses do método para que o mesmo método possa trabalhar com valores diferentes a cada chamada.
Você lista cada parâmetro com um tipo e um nome. Dentro do corpo do método, um parâmetro se comporta como uma variável local comum que já contém o que quem chamou passou.
name é o parâmetro. "Sam" e "Alex" são os argumentos - os valores concretos fornecidos na chamada. Uma definição de método, duas saídas diferentes.
Parâmetros versus argumentos
Essas duas palavras são usadas de forma solta, mas vale a pena manter a distinção clara:
- Um parâmetro é o espaço reservado na declaração:
String name. - Um argumento é o valor que você realmente passa:
"Sam".
Então void greet(String name) declara um parâmetro, e greet("Sam") passa um argumento. Quando alguém diz "este método recebe dois parâmetros", se refere à declaração; "passei dois argumentos" se refere à chamada.
Múltiplos parâmetros
Separe os parâmetros com vírgulas e dê a cada um o seu próprio tipo - você não pode compartilhar um tipo entre dois parâmetros como faria em uma declaração de variável:
Os argumentos são associados aos parâmetros estritamente por posição, não por nome. describe("Sam", 30, true) funciona porque a ordem coincide com (String name, int age, boolean active). Troque dois argumentos de tipos compatíveis e você terá um bug de lógica silencioso, não um erro de compilação - por isso a ordem importa.
Um erro comum é escrever int add(int a, b). Cada parâmetro precisa do seu próprio tipo: int add(int a, int b).
Retornando um valor
Parâmetros são como os dados fluem para dentro; o valor de retorno é como um resultado flui de volta para fora. Declare o tipo de retorno antes do nome do método e use return para devolver um valor a quem chamou:
O tipo de retorno (double) deve coincidir com o que você realmente faz return. Um método declarado void não retorna nada - ele ainda pode usar um return; simples para sair mais cedo, mas não pode retornar um valor. No instante em que return é executado, o método termina e o controle volta para o ponto da chamada.
Java é passagem por valor
Isso confunde quase todo mundo no início. Quando você passa um argumento, Java copia o valor para o parâmetro. Para tipos primitivos, isso significa que o método recebe sua própria cópia - alterar o parâmetro nunca toca a variável de quem chamou:
x continua 5. O método modificou sua própria cópia do número, não o original.
Passando objetos: ainda por valor, mas atenção à referência
Objetos parecem uma exceção, mas não são. O que é copiado é a referência (a seta que aponta para o objeto), não o objeto em si. Então o método aponta para o mesmo objeto e pode mutá-lo:
Dois resultados diferentes, uma só regra. addItem segue a referência e altera a lista real, então quem chamou vê new aparecer. replace reatribui o parâmetro a uma lista totalmente nova - mas isso só reaponta a cópia local da referência, então a list de quem chamou permanece intacta. A conclusão: você pode alterar um objeto através de um parâmetro, mas nunca pode fazer a variável de quem chamou apontar para outro lugar.
Próximo: sobrecarga de métodos
Agora você sabe como fornecer a um método exatamente as entradas de que ele precisa. Mas e se você quiser que um mesmo nome de método aceite conjuntos diferentes de parâmetros - digamos print(int) e print(String)? Isso é sobrecarga de métodos, e é a próxima página.
Perguntas frequentes
Qual é a diferença entre um parâmetro e um argumento em Java?
Um parâmetro é a variável nomeada na declaração do método - String name em void greet(String name). Um argumento é o valor concreto que você passa ao chamar o método - greet("Sam") passa o argumento "Sam". Em resumo: parâmetros vivem na definição, argumentos vivem na chamada.
Java é passagem por valor ou por referência?
Java é sempre passagem por valor. Para tipos primitivos, é passada uma cópia do valor, então reatribuir o parâmetro não altera a variável de quem chamou. Para objetos, é passada uma cópia da referência - você pode mutar o objeto para o qual a referência aponta (por exemplo, adicionar a uma lista), mas reatribuir o próprio parâmetro não afeta a variável de quem chamou.
Como passar vários argumentos para um método em Java?
Liste os parâmetros na declaração separados por vírgulas, cada um com seu próprio tipo: int add(int a, int b). Chame-o com os argumentos na mesma ordem: add(2, 3). Java associa os argumentos aos parâmetros estritamente por posição, não por nome, então a ordem precisa coincidir.