Overloading e a referência this

Programação 3: Orientação a Objetos e Java


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 print_saldo(long num) {
    Conta	c;

    c = procura(num); 
    if (c == null) System.out.println("A conta " + num + " nao existe!");
    else c.print_saldo();
  }
De fato, a expressão procura(num) é uma abreviação para
this.procura(num)
onde this denota o próprio objeto (banco) executando o método print_saldo e que, portanto, irá executar o método procura 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 print_saldo requisita a ele mesmo a conta de número num cadastrada no próprio banco.

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

  void debito(long num, double val) {
    Conta	c;

    c = this.procura(num); 
    if (c == null) System.out.println("A conta " + num + " nao existe!");
    else c.debito(val);    
  }
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 exemplo, a definição do método
  void print_saldo() {
    int 	i;
 
    for (i = 0; i < indice; i = i + 1) { 
      contas[i].print_saldo();
    }
  }
não causa nenhum conflito ou erro, mesmo tendo um método declarado da mesma forma em Conta. Por isso dizemos que Java suporta overloading de métodos.


Paulo Borba (phmb@di.ufpe.br)