Sobrecarga de operadores

Caros,
Li que Java não fornece recursos para sobrecarga de operadores tal como existe na linguagem C++.
O que vem a ser essa sobrecarga de operadores? Tem algum exemplo?

Sobrecarga de operador seria a capacidade de se alterar a forma como um operador opera seus operandos. Confuso? Imagine então uma classe em C++ como a seguir (Não lembro direito como programar nessa liguagem. Tente “abstrair” meus erros, ok?)

public class Ponto{
private:
   int x;
   int y;
public:
   Ponto(int x, int y){
      this.x = x;
      this.y = y;
   }

   //getters e setters
}

Vamos supor que queiramos estabelecer a operação de soma de dois objetos Ponto da seguinte forma: Quando adicionamos um objeto Ponto p1 a um outro objeto Ponto p2, queremos obter um terceiro objeto Ponto p3 tal que:

:arrow: p3.x = p1.x + p2.x
:arrow: p3.y = p1.y + p2.y

Não tem como o C++ adivinhar como se calcula o valor do p3:

Ponto p1 (5, 9);
Ponto p2 (5, 1);
Ponto p3 = p1 + p2;

Então, o programador é quem tem que “dizer” como o “+” vai operar seus operandos. Isto é feito através de sobrecarga de operadores. Como isso se daria no nosso exemplo? Veja:

public class Ponto{
private:
   int x;
   int y;
public:
   Ponto(int x, int y){
      this.x = x;
      this.y = y;
   }

   //getters e setters

   Ponto operator+(const Ponto &other){
      return new Ponto(
         this.x + other.x, 
         this.y + other.y
      );
   }
}

A palavra chave operator serve para sobrescrever operadores ("+", “-”, “>”, etc…). No nosso caso, o método chamado “operator+” representa a sobrecarga do operador “+” quando se tenta somar um objeto Ponto com um outro objeto Ponto, resultando em um novo objeto Ponto. Agora, se você fizesse isso:

Ponto p1 (5, 9);
Ponto p2 (5, 1);
Ponto p3 = p1 + p2;
cout<<p3.getX()<<";"<<p3.getY();

A saida do programa seria algo como:

10;10

Em Java não existe esse recurso. Você não pode mudar o comportamento dos operadores de Java. Se for necessário, a sua classe deve então prover algum método que fassa tal tarefa. Veja por exemplo a mesma classe Ponto como poderia ser feita em Java:

public class Ponto{
   private int x;
   private int y;

   public Ponto(int x, int y){
      this.x = x;
      this.y = y;
   }

   //getters e setters

   public Ponto somar(Ponto other){
      return new Ponto(
         this.x + other.x, 
         this.y + other.y
      );
   }
}

Aí, em java vc usaria dessa forma:

Ponto p1 = new Ponto(5, 9);
Ponto p2 = new Ponto(5, 1);
Ponto p3 = p1.somar(p2);
System.out.println(p3.getX() + ";" + p3.getY());

para ter a mesma saída “10;10”

EDIT - Mantu, a sua explicação é excelente. Só corrigi algumas perfumarias do C++.

muito obrigada pela explicação. Foi excelente.
Abs
Mary

Opa! Muito obrigado! Seja lá quem for você… :lol: :lol: :lol: