11.12. Estrutura de Classes e Objetos em Java: Sobrecarga e Sobrescrita de Métodos
Java, sendo uma linguagem de programação orientada a objetos, oferece uma estrutura robusta para a definição de classes e objetos. Um conceito fundamental nesse contexto é o de métodos, que são essencialmente as ações que os objetos podem executar. A flexibilidade do uso de métodos é ampliada por dois conceitos importantes: sobrecarga (overloading) e sobrescrita (overriding) de métodos. Vamos explorar cada um desses conceitos em detalhes.
Sobrecarga de Métodos (Overloading)
A sobrecarga de métodos é um recurso que permite a um programador definir vários métodos com o mesmo nome dentro de uma classe, desde que eles tenham listas de parâmetros diferentes. A sobrecarga é útil quando você quer realizar a mesma operação de maneiras diferentes, dependendo dos argumentos passados para o método.
public class Calculadora {
// Sobrecarga com dois parâmetros
public int somar(int a, int b) {
return a + b;
}
// Sobrecarga com três parâmetros
public int somar(int a, int b, int c) {
return a + b + c;
}
}
No exemplo acima, a classe Calculadora
tem dois métodos chamados somar
. Um deles soma dois números, enquanto o outro soma três. O compilador Java distingue qual método chamar com base nos argumentos passados na chamada do método.
Sobrescrita de Métodos (Overriding)
A sobrescrita de métodos, por outro lado, ocorre quando uma subclasse redefine um método da superclasse. O método sobrescrito na subclasse deve ter a mesma assinatura, ou seja, o mesmo nome, tipo de retorno e parâmetros que o método na superclasse. A sobrescrita é usada para fornecer uma implementação específica de um método que já é fornecido por sua classe pai.
class Animal {
public void emitirSom() {
System.out.println("O animal faz um som");
}
}
class Cachorro extends Animal {
// Sobrescrita do método emitirSom
@Override
public void emitirSom() {
System.out.println("O cachorro late");
}
}
No exemplo acima, a classe Cachorro
sobrescreve o método emitirSom
da classe Animal
. Quando um objeto da classe Cachorro
chama emitirSom
, a nova implementação é executada, e não a da classe Animal
.
Regras para Sobrescrita de Métodos
Há algumas regras que precisam ser seguidas para sobrescrever um método corretamente:
- O método na subclasse deve ter a mesma assinatura que o método na superclasse.
- O método na subclasse deve ser pelo menos tão acessível quanto o método na superclasse.
- O método na subclasse não pode lançar exceções verificadas mais amplas do que o método na superclasse.
- Se o método na superclasse retorna um tipo, o método na subclasse deve retornar o mesmo tipo ou um subtipo (covariância).
Diferenças entre Sobrecarga e Sobrescrita
Embora ambos os conceitos permitam o uso de métodos com o mesmo nome, eles são usados em contextos diferentes e têm regras diferentes:
- Sobrecarga ocorre dentro da mesma classe e é usada para métodos que realizam a mesma operação de maneiras diferentes, com diferentes parâmetros.
- Sobrescrita ocorre entre uma superclasse e uma subclasse e é usada para fornecer uma implementação específica de um método que já existe na superclasse.
Palavra-chave super
Quando sobrescrevemos um método, às vezes queremos chamar a versão do método da superclasse antes de adicionar a funcionalidade específica da subclasse. Isso pode ser feito usando a palavra-chave super
.
class Gato extends Animal {
@Override
public void emitirSom() {
super.emitirSom(); // Chama o método da superclasse
System.out.println("O gato mia");
}
}
Neste exemplo, a classe Gato
sobrescreve o método emitirSom
, mas também chama a implementação do método da classe Animal
antes de adicionar sua própria funcionalidade.
Conclusão
A compreensão da sobrecarga e sobrescrita de métodos é essencial para o uso efetivo da programação orientada a objetos em Java. Esses conceitos permitem que os programadores escrevam código mais flexível e reutilizável, facilitando a manutenção e a expansão de sistemas. Ao dominar a sobrecarga e a sobrescrita, você será capaz de criar classes que se comportam de maneira polimórfica, respondendo de forma diferente a mensagens comuns, o que é um princípio fundamental da orientação a objetos.