Overloading e a referência this


Considere o método a seguir que imprime o saldo de uma conta cadastrada com o número num. Se nenhuma conta for cadastrada com este número no banco responsável pela execução do método, imprime-se uma mensagem de erro:
    void printSaldo(long numero) {
        Conta c;

        c = procurar(numero);
        if (c == null)
            System.out.println("A
conta " + numero + " nao existe!");
        else
            c.printSaldo();
    }
Em particular, é interessante notar que a expressão procurar(numero) corresponde à invocação de um método, mas não se especifica que objeto será responsável pela execução do método; temos uma mensagem sem um destinatário explícito!

De fato, como já vimos anteriormente, atributos e métodos são relativos a objetos e a expressão procurar(numero) é simplesmente uma abreviação para

    this.procurar(numero)
onde this denota o próprio objeto (banco) executando o método printSaldo e que, portanto, irá executar o método procurar também. Assim, a expressão acima denota o envio de uma mensagem de um objeto para ele mesmo; isto é, o banco que executa a operação printSaldo requisita a ele mesmo a conta de número numero cadastrada no próprio banco.

De uma forma geral, quando um método m é invocado a partir de um método n:

  ... n() {
      ...
      m();
      ...
  }...
Java assume que o objeto responsável pela execução de m será o mesmo responsável pela execução de n. Daí surge a convençÃo de que no exemplo acima m() é uma abreviação para this.m().

Similarmente, temos a operação que debita uma conta específica cadastrada em um banco, caso ela exista:

    void debitar(long numero, double valor) {
        Conta c;

        c = this.procurar(numero);
        if (c == null)
            System.out.println("A conta " + numero + " nao existe!");
        else
            c.debitar(valor);
    }
Note que os dois métodos apresentados acima têm o mesmo nome de métodos definidos na classe Conta. De fato, métodos podem ter o mesmo nome desde que tenham tipos diferentes; isto é, os métodos devem ser associados a classes diferentes ou terem o número, a ordem ou os tipos dos parâmetros diferentes. Por isso dizemos que Java suporta overloading de métodos.

O sistema Java consegue identificar que na expressão c.debitar(valor) vai ser usado o método debitar de Conta, já que a mensagem está sendo enviada a um objeto cujo nome está armazenado em c e c é do tipo Conta.


Paulo Borba (phmb@cin.ufpe.br)
Rodrigo Queiroz (rqcl@cin.ufpe.br)