É a capacidade que uma classe tem de conter várias versões do mesmo método, usando o mesmo identificador (nome), desde que estas versões tenham assinaturas diferentes. A sobrecarga pode ocorrer na mesma classe ou em classes descendentes. Esse importante recurso permite que a mesma tarefa seja executada de várias maneiras diferentes dependendo das informações que estão disponíveis no momento.

Como exemplo, vamos considerar a classe Ponto com esta implementação. Note que a classe implementa o método distance para retornar a distancia do ponto até um par de coordenadas (x,y) que são informadas nos parâmetros do método. Poderia ser útil para quem utilizar a classe, que fosse possível calcular a distância entre dois objetos da classe Ponto. Nesse caso, o método distance pode ser sobrecarregado com mais uma versão, que aceite nos parâmetros um objeto da classe Ponto em vez de coordenadas. Veja o exemplo abaixo:
public class Ponto {
   protected double x, y; // coordenadas do ponto
 
   // ... (outros métodos da classe)
 
   // Retorna a distancia do ponto até as coordenadas informadas
   //
   public double distance(double posX, double posY){
      double dx = deltaX(posX);
      double dy = deltaY(posY);
      return Math.sqrt(dx*dx + dy*dy);
   }
 
   // Sobrecarga do método distance
   // Retorna a distancia do ponto até outro objeto Ponto
   //
   public double distance(Ponto pt){
      // a versão "coordenadas" do método é chamada
      return distance(pt.x, pt.y); // aqui para aproveitar o código do cálculo
   }