Os métodos, denominados funções ou procedimentos nas linguagens de programação estruturada, são trechos de códigos que realizam alguma tarefa específica e podem como resultado retornar um valor.

Parâmetros são canais pelos quais se estabelece uma comunicação entre um método e o seu módulo chamador (o método main ou outro método). Dados são passados pelo módulo chamador ao método chamado por meio de parâmetros.

Tecnicamente os parâmetros são classificados como parâmetros formais e parâmetros reais. Os parâmetros formais são os nomes simbólicos introduzidos nos "cabeçalhos" dos métodos. Já os parâmetros reais, ou parâmetros efetivos (ou ainda, argumentos) são aqueles que se associam aos parâmetros formais quando da chamada, ou invocação, de um método.

Em síntese, os argumentos são variáveis especificadas entre parênteses na chamada de um método; e os parâmetros são variáveis declaradas no cabeçalho do método para indicar os valores que o método deve receber quando for chamado.

A aplicação Java apresentada na Listagem 1 pode-se observar a utilização de argumentos e parâmetros na comunicação entre métodos.

Listagem 1: Demonstrando a utilização de argumentos e parâmetros.

public class ExemploUm {

  public static void main(String args[]) {
    int nro1 = 2, nro2 = 3;

    // chamando (ou invocando) o método "somarValores"
    // "nro1" e "nro2" são os argumentos usados na chamada
    System.out.printf("%d + %d = %d\n\n", nro1, nro2, somarValores(nro1, nro2));
  }

  // "a" e "b" são os parâmetros do método "somarValores"
  public static int somarValores(int a, int b) { // cabeçalho do método "somarValores"
    return(a + b);
  }

}

No método main() foram declaradas e inicializadas às variáveis simples do tipo int: nro1e nro2. Em seguida, foi realizada a chamada ao método somarValores() usando como argumentos as variáveis nro1e nro2.

No cabeçalho do método somarValores() foram declarados os parâmetros a e b que receberão os argumentos nro1e nro2. Como resposta, o método retorna a soma dos valores dos parâmetros através da instrução return(a + b).

Na Figura 1 pode-se observar a execução da classe ExemploUm que utiliza os argumentos para realizar a comunicação entre métodos.

Executando a classe ExemploUm na utilização de argumentos

Figura 1: Executando a classe ExemploUm na utilização de argumentos

Um dos novos recursos disponibilizados a partir do Java 1.5, ou Java 5.0, permite ao programador criar métodos que recebem um número "não" especificado de argumentos. Este recurso é conhecido como listas de argumentos de comprimento variável (varargs). Um tipo de parâmetro seguido por reticências(...) na lista de parâmetros indica que o método recebe um número variável de argumentos desse tipo particular. No corpo do método, a lista de parâmetros de tamanho variável é vista como um array (disponibilizando para cada argumento uma posição de armazenamento).

Em DEITEL (2005, pág. 232), encontra-se que essa utilização das reticências, juntamente com seu tipo de dados, só pode ocorrer uma única vez e sempre no final da lista de parâmetros, como pode ser observado nos cabeçalhos dos métodos mostrarValores() e somarValores() da Listagem 2.

Listagem 2: Implementando listas de argumentos (parâmetros) de comprimento variável.

public class ExemploDois {

  public static void main(String args[]) {
    int nro1 = 10, nro2 = 20, nro3 = 30, nro4 = 40;

    mostrarValores("1a. Chamada = ", nro1, nro2);
    System.out.printf("%d\n", somarValores(nro1, nro2));

    mostrarValores("2a. Chamada = ", nro1, nro2, nro3);
    System.out.printf("%d\n", somarValores(nro1, nro2, nro3));

    mostrarValores("3a. Chamada = ", nro1, nro2, nro3, nro4);
    System.out.printf("%d\n", somarValores(nro1, nro2, nro3, nro4));
  }

  public static void mostrarValores(String s, int... param) {
    int i, n = param.length;
    
    System.out.printf("%s", s);

    for (i=0; i < n; i++) {
      if (i < (n-1))
         System.out.printf("%d + ", param[i]);
      else System.out.printf("%d = ", param[i]); // último valor mostrado
    }
  }

  public static int somarValores(int... param) {
    int sm = 0;
    
    // estrutura "for" aprimorada (o identificador "nro" representa
    // os valores sucessivos da lista de parâmetros "param")
    for (int nro: param) {
      sm = sm + nro;
    }

    return(sm); // resposta do método "somarValores"
  }

}

No método main() foram declaradas e inicializadas às variáveis simples do tipo int: nro1, nro2, nro3e nro4. Em seguida, foi implementada um conjunto de três chamadas, usando listas de argumentos de comprimento variável, aos métodos mostrarValores() e somarValores(). Adicionalmente, no método mostrarValores(), foi acrescentado um primeiro argumento String para identificar a chamada realizada. A lista de argumentos, comum aos dois métodos, é formada na primeira chamada pelos valores das variáveis nro1e nro2; já na segunda chamada, os argumentos usados foram os valores das variáveis nro1, nro2e nro3; e, na terceira e última chamada da sequência, a lista de argumentos foi formada pelos valores das variáveis nro1, nro2, nro3e nro4.

Na implementação do método mostrarValores() foi utilizado o campo length para acessar o número de argumentos passados pela respectiva chamada realizada no método main(). Inicialmente, através de uma operação de saída usando o método printf(), é mostrado o número da chamada através da referência ao parâmetro s. A seguir, através de uma instrução de repetição (for), o valor do i-ésimo parâmetro da lista (param[i]) é exibido juntamente com o símbolo +, exceção feita ao último passo, quando o valor será mostrado seguido desta vez pelo símbolo =.

Por último, o método somarValores() foi implementado usando uma estrutura de repetição for aprimorada para somar os valores sucessivos da lista de parâmetros (param). Como resposta, o método retorna o somatório dos valores dos parâmetros através da instrução return(sm).

Na Figura 2 pode-se observar a execução da classe ExemploDois na utilização de listas de argumentos (parâmetros) de comprimento variável.

Executando a classe ExemploDois na utilização de listas de argumentos de comprimento variável

Figura 2: Executando a classe ExemploDois na utilização de listas de argumentos de comprimento variável

Referência bibliográfica

DEITEL, H.M. (2005) Java: Como Programar. São Paulo: Person Prentice Hall, 6ª edição. Capítulo 7: Arrays (7.11 Lista de argumentos de comprimento variável), páginas 232-233.

Este tema também pode ser pesquisado como "argumentos variáveis", "varargs", "parâmetro com número variável de argumentos", entre outros.

No próximo artigo pretendo apresentar como este recurso pode ser implementado em aplicações Delphi.

Obrigado e um abraço.

Prof. Omero Francisco Bertol (http://www.pb.utfpr.edu.br/omero/)

Aplicações Java (http://www.pb.utfpr.edu.br/omero/Java/Fontes.HTM)