Parâmetros e Argumentos em Métodos Java
Parâmetros funcionam como variáveis de entrada para um método, permitindo que dados externos sejam passados para sua lógica interna. Isso torna os métodos mais versáteis e poderosos.
É crucial entender a distinção técnica entre parâmetros e argumentos:
- Parâmetro: É a variável declarada na assinatura do método.
- Argumento: É o valor real que é passado para o parâmetro durante a chamada do método.
Ao declarar um método, você especifica uma lista de parâmetros, cada um com seu tipo e nome.
// 'x' e 'y' são os parâmetros do método
static void sum(int x, int y) {
int z = x + y;
System.out.println(z);
}
Ao chamar este método, você deve fornecer argumentos compatíveis. Os valores dos argumentos são atribuídos aos parâmetros com base em sua posição:
public class Program {
public static void main (String args[]) {
int a = 6;
int b = 8;
// 'a' e 'b' são os argumentos passados na chamada
sum(a, b); // Imprime 14
// O literal '3' e a variável 'a' são os argumentos
sum(3, a); // Imprime 9
}
static void sum(int x, int y) {
int z = x + y;
System.out.println(z);
}
}
No exemplo, na chamada sum(a, b)
, o valor da variável a
(o primeiro argumento) é copiado para o parâmetro x
. O valor de b
(o segundo argumento) é copiado para o parâmetro y
.
Correspondência de Tipos e Ordem
A assinatura do método define um contrato rígido. O número, o tipo e a ordem dos argumentos em uma chamada devem corresponder exatamente à lista de parâmetros do método.
public class Program {
public static void main (String args[]) {
// A chamada respeita a ordem: String primeiro, int depois.
display("Tom", 34);
}
static void display(String name, int age) {
System.out.println("Name: " + name);
System.out.println("Age: " + age);
}
}
Uma chamada como display(34, "Tom")
resultaria em um erro de compilação, pois os tipos dos argumentos não correspondem aos tipos dos parâmetros na ordem esperada.
Parâmetros de Comprimento Variável (Varargs)
Para cenários onde um método precisa aceitar um número flexível de argumentos de um mesmo tipo, Java oferece os parâmetros de comprimento variável (varargs). A sintaxe utiliza uma reticência ...
após o tipo do parâmetro.
public class Program {
public static void main (String args[]){
sum(1, 2, 3); // 3 argumentos. Imprime 6
sum(1, 2, 3, 4, 5); // 5 argumentos. Imprime 15
sum(); // 0 argumentos. Imprime 0
}
// 'numbers' é um parâmetro varargs
static void sum(int... numbers) {
int result = 0;
// Internamente, 'numbers' é tratado como um array de int (int[])
for(int n : numbers) {
result += n;
}
System.out.println(result);
}
}
Internamente, o compilador Java trata um parâmetro varargs como um array. Isso permite que o método sum
seja chamado com qualquer quantidade de argumentos do tipo int
, incluindo nenhum.
Regra Essencial: Varargs Sempre por Último
Se um método possui múltiplos parâmetros, o parâmetro varargs deve ser obrigatoriamente o último da lista. Isso evita ambiguidades para o compilador.
public static void main(String[] args) {
printSum("Soma:", 20, 10, 30); // "Soma:" vai para 'message', o resto para 'numbers'
printSum("Olá, Mundo!"); // "Olá, Mundo!" vai para 'message', 'numbers' fica vazio
}
static void printSum(String message, int... numbers){
System.out.println(message);
int result = 0;
for(int x : numbers) {
result += x;
}
System.out.println(result);
}
📝 Exercícios
Tarefa 1
Complete o método min
abaixo para que ele retorne o menor de dois números inteiros, a
e b
.
public class Comparator {
public static void main(String[] args) {
// A linha abaixo deve imprimir: O menor valor é 5
System.out.println("O menor valor é " + min(10, 5));
}
// Complete este método
static int min(int a, int b) {
// seu código aqui
}
}
Resposta
public class Comparator {
public static void main(String[] args) {
// A linha abaixo deve imprimir: O menor valor é 5
System.out.println("O menor valor é " + min(10, 5));
}
// Complete este método
static int min(int a, int b) {
return (a < b) ? a : b;
}
}
Tarefa 2
Complete o método printAllNames
para que ele receba um número variável de nomes (String
) e imprima cada um em uma nova linha.
public class NamePrinter {
public static void main(String[] args) {
// A chamada abaixo deve imprimir:
// Ana
// Carlos
// Beatriz
printAllNames("Ana", "Carlos", "Beatriz");
}
// Complete este método usando varargs
static void printAllNames(String... names) {
// seu código aqui
}
}
Resposta
public class NamePrinter {
public static void main(String[] args) {
// A chamada abaixo deve imprimir:
// Ana
// Carlos
// Beatriz
printAllNames("Ana", "Carlos", "Beatriz");
}
// Complete este método usando varargs
static void printAllNames(String... names) {
for (String name : names) {
System.out.println(name);
}
}
}