AFF Education Construa seu Futuro

Aula 34 - Métodos personalizados - EXTRA

Métodos - conteúdo extra

Métodos personalizado estáticos e não estáticos

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.

  • Método de instância (não estático): pertence a cada objeto. Você precisa de uma instância para chamá-lo.
  • Método estático (static): pertence à classe. Não precisa de objeto.

Métodos com Parâmetros Variáveis (Varargs)

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

Diagrama do for-each iterando sobre array recebido via varargs
Figura 3 — Visualização do 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.

Sobrecarga de Métodos (Method Overloading)

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

N

dade: 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.

Exercícios

Teste seus conhecimentos sobre métodos em Java:

1. O que permite a um método aceitar um número variável de argumentos em Java?

2. O que é a sobrecarga de métodos (method overloading)?

3. Qual é a característica fundamental de um método recursivo?

4. O que acontece se um método recursivo não tiver um caso base (condição de parada)?

5. Complete o código para calcular a potência de um número usando recursão:

public static int potencia(int base, int expoente) {
    if (expoente == 0) {
        return 1;
    }
    return _____________________
}

Exercícios de Aplicação AFF Education

Reforce o conteúdo desta aula com mais dois exercícios práticos:

1. Dado public static int somar(int a, int b){ return a + b; }, qual o valor de somar(somar(1,2), 3)?

2. Um método pode chamar outro método dentro de si mesmo?