Em Java, métodos podem ser classificados em dois tipos principais: métodos de instância (não estáticos) e métodos estáticos (de classe).
Métodos de instância pertencem a objetos específicos, enquanto métodos estáticos pertencem à classe em si e podem ser chamados sem criar uma instância da classe.
Métodos não estáticos pertencem a uma instância específica de uma classe. Eles podem acessar e modificar variáveis de instância (variáveis de objeto) e invocar outros métodos de instância
public class Saudacao {
private String nome;
// Método não estático
public void setNome(String novoNome) {
this.nome = novoNome;
}
// Método não estático
public String getSaudacao() {
return "Olá, " + this.nome + "!";
}
// Uso (ponto de entrada do programa)
public static void main(String[] args) {
Saudacao s = new Saudacao();
s.setNome("Mundo");
System.out.println(s.getSaudacao());
}
}
Olá, Mundo!
Métodos estáticos pertencem à própria classe, em vez de a qualquer instância individual da classe. Eles são declarados usando a palavra-chave static.
public class Calculadora {
// Método estático
public static int somar(int a, int b) {
return a + b;
}
public static void main(String[] args) {
int resultado = Calculadora.somar(5, 10);
System.out.println(resultado); // Imprime 15
}
}
15
O método Saudacao é um método de instância e o método Calculadora é um método estático.
Java permite criar métodos que aceitam um número variável de argumentos usando a sintaxe de reticências (...).
int... numeros é varargs (variadic arguments) em Java.
Dentro de um método variadic arguments é uma forma diferente de representar vetores ou arrays.
int... numeros é equivalente à int[] numeros
for-each percorrendo o array
recebido via varargs (int... numeros).
Cada iteração atribui o próximo valor do array à variável
numero, permitindo somar ou imprimir todos
os argumentos sem se preocupar com a quantidade.
public class MetodosComVarargs {
public static void main(String[] args) {
// Chamando com diferentes quantidades de parâmetros
imprimirNumeros(1, 2, 3);
imprimirNumeros(10, 20, 30, 40, 50);
imprimirNumeros(); // Sem parâmetros é válido!
// Somando diferentes quantidades de números
System.out.println("Soma: " + somar(5, 10));
System.out.println("Soma: " + somar(1, 2, 3, 4, 5));
System.out.println("Soma: " + somar()); // Sem parâmetros retorna 0
// Encontrando o maior valor
System.out.println("Maior valor: " + encontrarMaior(3, 8, 2, 10, 5));
}
// Método que aceita um número variável de inteiros
public static void imprimirNumeros(int... numeros) {
System.out.print("Números: ");
for (int numero : numeros) {
System.out.print(numero + " ");
}
System.out.println();
}
// Método que soma um número variável de inteiros
public static int somar(int... numeros) {
int soma = 0;
for (int numero : numeros) {
soma += numero;
}
return soma;
}
// Método que encontra o maior valor entre um número variável de inteiros
public static int encontrarMaior(int... numeros) {
if (numeros.length == 0) {
throw new IllegalArgumentException("Nenhum número fornecido");
}
int maior = numeros[0];
for (int i = 1; i < numeros.length; i++) {
if (numeros[i] > maior) {
maior = numeros[i];
}
}
return maior;
}
}
Números: 1 2 3
Números: 10 20 30 40 50
Números:
Soma: 15
Soma: 15
Soma: 0
Maior valor: 10
Dica: Varargs (e.g., int...) não são “outra forma de representar arrays”; eles são atalho sintático para receber um array como último parâmetro, permitindo chamar o método com zero ou mais argumentos sem criar o array manualmente. Dentro do método, int... nums é exatamente um int[] nums.
A sobrecarga de métodos permite definir múltiplos métodos com o mesmo nome, mas com diferentes parâmetros.
public class SobrecargaDeMetodos {
public static void main(String[] args) {
// Chamando diferentes versões do método exibirInfo
exibirInfo();
exibirInfo("João");
exibirInfo("Maria", 30);
exibirInfo(25);
// Chamando diferentes versões do método calcularArea
System.out.println("Área do quadrado: " + calcularArea(5));
System.out.println("Área do retângulo: " + calcularArea(5, 10));
System.out.println("Área do retângulo (float): " + calcularArea(5.5f, 10.5f));
}
// Método sem parâmetros
public static void exibirInfo() {
System.out.println("Nenhuma informação fornecida");
}
// Sobrecarga: método com um parâmetro String
public static void exibirInfo(String nome) {
System.out.println("Nome: " + nome);
}
// Sobrecarga: método com um parâmetro int
public static void exibirInfo(int idade) {
System.out.println("Idade: " + idade + " anos");
}
// Sobrecarga: método com dois parâmetros
public static void exibirInfo(String nome, int idade) {
System.out.println("Nome: " + nome + ", Idade: " + idade + " anos");
}
// Cálculo da área de um quadrado
public static int calcularArea(int lado) {
return lado * lado;
}
// Sobrecarga: cálculo da área de um retângulo com inteiros
public static int calcularArea(int base, int altura) {
return base * altura;
}
// Sobrecarga: cálculo da área de um retângulo com float
public static float calcularArea(float base, float altura) {
return base * altura;
}
}
Nenhuma informação fornecida
Nome: João
ome: Maria, Idade: 30 anos
Ndade: 25 anos
IÁrea do quadrado: 25
Área do retângulo: 50
Área do retângulo (float): 57.75
Importante: Na sobrecarga de métodos, os métodos devem diferir na quantidade ou nos tipos de parâmetros. O tipo de retorno sozinho não é suficiente para diferenciar métodos sobrecarregados.
Teste seus conhecimentos sobre métodos em Java:
Reforce o conteúdo desta aula com mais dois exercícios práticos: