Press enter to see results or esc to cancel.

Sobrecarga (Overload) de métodos em Java

A sobrecarga, ou overload em inglês, permite a existência de vários métodos com o mesmo nome. Veremos como funciona a sobrecarga de métodos e a sua relação com lista de argumentos, tipos de retorno e modificadores de acesso.

Sobrecarga

Imagine que você esteja desenvolvendo um jogo de corrida. Nesse jogo o seu personagem pode acelerar vários veículos: carros, caminhonetes e motocicletas.

Podemos escrever os seguintes métodos para fazer cada veículo acelerar:

class Carro {}

class Motocicleta {}

class Caminhonete {}


public class Personagem {

    public void acelerarCarro(Carro carro) {}


    public void acelerarMotocicleta(Motocicleta motocicleta) {}


    public void acelerarCaminhonete(Caminhonete caminhonete) {}

}

São métodos com nomes diferentes e, por isso, não existe relação alguma entre eles.

A instrução “acelerar” é a mesma para os diferentes tipos de veículos. Portanto, é mais interessante usar o mesmo nome do método para os diferentes veículos. Podemos reescrever os métodos anteriores da seguinte forma:

class Carro {}

class Motocicleta {}

class Caminhonete {}


public class Personagem {

    public void acelerar(Carro carro) {}


    public void acelerar(Motocicleta motocicleta) {}


    public void acelerar(Caminhonete caminhonete) {}

}

Repare que o nome dos métodos é o mesmo e o que muda são os parâmetros.


Métodos sobrecarregados são escritos com o mesmo nome, mas com uma lista de argumentos diferente. São geralmente usados dentro de uma mesma classe.


A sobrecarga pode ocorrer com classes derivadas também. No código abaixo, o personagem Barrichello possui o método acelerar que possui o mesmo nome dos métodos que foram herdados da classe Personagem.

class Carro {}

class Motocicleta {}

class Caminhonete {}

class F1 {}


public class Personagem {

    public void acelerar(Carro carro) {}


    public void acelerar(Motocicleta motocicleta) {}


    public void acelerar(Caminhonete caminhonete) {}

}


class Barrichello extends Personagem{

    public void acelerar(F1 f1) {}

}


O método public void acelerar(F1 f1) da classe Barrichelo também é um método sobrecarregado, pois a classe Barrichello também possui os métodos public void acelerar(Carro carro), public void acelerar(Motocicleta motocicleta) e public void acelerar(Caminhonete caminhonete) que foram herdados da classe Personagem.

Lista de Argumentos

Nós já definimos que para os métodos serem considerados sobrecarregados eles tem que ter o mesmo nome e lista de argumentos diferentes. Mas o que exatamente faz com que listas de argumentos sejam diferentes? As listas podem diferir das seguintes formas:

Números de parâmetros diferentes

public void acelerar(Caminhonete caminhonete, Carro carro)

public void acelerar(Caminhonete caminhonete)

Tipos de parâmetros diferentes

public void acelerar(Carro carro)

public void acelerar(Motocicleta motocicleta)

Posições dos tipos dos parâmetros diferentes

public void acelerar(Carro carro, Motocicleta motocicleta)

public void acelerar(Motocicleta motocicleta, Carro carro)

É importante observar que apenas a posição do tipo importa. Trocar apenas os nomes dos parâmetros não faz com que a sobrecarga ocorra. O código abaixo não compila:

public void acelerar(Carro hondaCivic, Motocicleta kawasakiNinja)

public void acelerar(Carro fordFiesta, Motocicleta triumphBonneville)
O método acelerar(Carro,Motocicleta) já foi definido na classe Personagem.

No código anterior, as listas de argumentos são consideradas iguais pelo compilador. Como os dois métodos tem o mesmo nome e a mesma lista de argumentos, eles são consideramos iguais. Não podemos declarar dois métodos iguais dentro de uma mesma classe.

Tipos de Retorno

Métodos sobrecarregados podem ter tipos de retorno diferentes. Veja o exemplo abaixo:

public double acelerar(Motocicleta motocicleta, Carro carro)

public Caminhonete acelerar(Caminhonete caminhonete)

O que não pode ocorrer é tentar diferenciar um método do outro apenas pelo tipo do retorno. Lembre-se que o compilador só usa o nome do método e a lista de argumentos para saber se um método é diferente do outro ou não. O exemplo abaixo não compila:

public double acelerar(Carro hondaCivic, Motocicleta kawasakiNinja)

public Caminhonete acelerar(Carro fordFiesta, Motocicleta triumphBonneville)
O método acelerar(Carro,Motocicleta) já foi definido na classe Personagem.

Modificadores de Acesso

Assim como com os tipos de retorno, métodos sobrecarregados podem ter modificadores de acesso diferentes. Veja o código a seguir:

private void acelerar(Carro carro)

protected void acelerar(Motocicleta motocicleta)

O que pode dar errado neste caso é o mesmo que pode acontecer com os tipos de retorno. Não podemos diferenciar os métodos apenas pelo modificador de acesso. O código a seguir não compila:

public void acelerar(Carro hondaCivic, Motocicleta kawasakiNinja)

protected void acelerar(Carro fordFiesta, Motocicleta triumphBonneville)

Mesmo colocando modificadores de acesso diferentes e tipos de retorno diferentes, o compilador ainda diz que os métodos são iguais:

public int acelerar(Carro hondaCivic, Motocicleta kawasakiNinja)

protected double acelerar(Carro fordFiesta, Motocicleta triumphBonneville)
O método acelerar(Carro,Motocicleta) já foi definido na classe Personagem.

Para conhecer mais sobre os modificadores de acesso, veja este post.

Conclusão

As regras para usarmos métodos sobrecarregados são simples. O que você precisa lembrar para a usar sobrecarga de métodos é o seguinte:

  • Uma classe pode fazer a sobrecarga nos métodos que foram declarados dentro dela e também nos métodos herdados.
  • Métodos sobrecarregados devem possuir o mesmo nome.
  • Métodos sobrecarregados devem possuir listas de parâmetros diferentes.
  • Métodos sobrecarregados podem ter modificadores de acesso e tipos de retorno diferentes, mas ele não podem ser usados para diferenciar um método do outro.
Share on FacebookTweet about this on TwitterShare on Google+Share on LinkedInEmail this to someone
Comments

Leave a Comment