Skip to content

Sobrescrita - Overriding

Introdução

  • Sobrescrita / method overriding = ocorre quando uma subclasse fornece sua própria implementação de um método que já está definido em sua superclasse
    • mesma assinatura, classes diferentes
  • a sobrescrita permite que a subclasse altere ou estenda o comportamento de um método herdado, oferecendo uma implementação específica para o contexto da subclasse
  • quando uma subclasse deseja alterar o comportamento de um método da superclasse, ela sobrescreve o método
    • isso significa que o método na subclasse terá o mesmo nome, tipo de retorno e parâmetros do método na superclasse
  • A sobrescrita é usada para fornecer implementações específicas de métodos, de forma que a subclasse possa alterar ou estender o comportamento herdado
// superclasse
public class Animal {
    public void fazerSom() {
        System.out.println("Som genérico de animal");
    }
}

// subclasse
// subclasse `Cachorro` sobrescreve o método `fazerSom()` da superclasse `Animal` para fornecer uma implementação específica para cachorros
public class Cachorro extends Animal {
    @Override
    public void fazerSom() {
        System.out.println("Latido");
    }
}

Anotação @Override

  • anotação @Override = utilizada para indicar que um método está sobrescrevendo um método da superclasse
  • embora não seja obrigatória, ela é recomendada porque ajuda a garantir que o método realmente sobrescreva o método da superclasse
  • evita erros de digitação no nome do método ou nos parâmetros
  • caso o método não esteja sobrescrevendo corretamente um método da superclasse, o compilador exibirá um erro
@Override
public void fazerSom() {
    System.out.println("Latido");
}

Sobrecarga x sobrescrita

Característica Sobrecarga / Overloading Sobrescrita / Overriding
Objetivo Criar vários métodos com o mesmo nome, mas com diferentes assinaturas Modificar ou estender o comportamento de um método da superclasse
Assinatura do método Diferença no número ou tipo dos parâmetros Mesma assinatura (nome, tipo de retorno, parâmetros) do método na superclasse
Uso da palavra-chave @Override Não utilizada Usada para garantir que o método está sobrescrevendo corretamente
Método da superclasse Não é afetado, novos métodos são criados O método da superclasse é substituído na subclasse
Visibilidade Não há regras de visibilidade O método sobrescrito na subclasse não pode ser menos acessível que o da superclasse

Acesso a métodos da superclasse - super

  • palavra-chave super = utilizada para referenciar membros (métodos ou atributos) da superclasse, dentro de um método sobrescrito ou de um construtor da subclasse
  • usando super em métodos = pode-se chamar um método da superclasse dentro do método sobrescrito da subclasse
public class Animal {
    public void fazerSom() {
        System.out.println("Som genérico de animal");
    }
}

// fazerSom() de Cachorro chama o fazerSom() de Animal
// só depois adiciona um comportamento específico
public class Cachorro extends Animal {
    @Override
    public void fazerSom() {
        super.fazerSom(); // chama o método da superclasse
        System.out.println("Latido"); // comportamento específico
    }
}

Exercícios

Questões

  1. A sobrescrita de métodos ocorre quando uma classe filha redefine um método da classe pai com a mesma assinatura, ou seja, o mesmo nome e os mesmos parâmetros.
  2. A anotação @Override é obrigatória, mas ela não tem efeito prático na compilação. Ela apenas serve para indicar a intenção do programador.
  3. A sobrescrita de métodos é uma forma de polimorfismo dinâmico, pois o método da classe pai que será executado é escolhido em tempo de execução, dependendo do tipo real do objeto.
  4. Em Java, é possível sobrescrever um método da classe pai mesmo se ele for private.
  5. Quando um método é sobrescrito, ele deve ter o mesmo tipo de retorno que o método da classe pai.
  6. A palavra-chave super pode ser usada para acessar um método sobrescrito da classe pai.
  7. Em Java, a sobrescrita de métodos pode ser feita com diferentes listas de parâmetros, mas o nome do método deve ser o mesmo.
  8. A anotação @Override pode ser usada apenas quando um método está sendo sobrescrito da classe pai.
  9. A sobrescrita de um método não altera a implementação da classe pai; ela substitui o método da classe pai na classe filha.
  10. É possível sobrescrever um método da classe pai e manter a visibilidade private na classe filha.
  11. Se um método da classe pai é sobrescrito, o método original da classe pai deixa de ser acessível diretamente pela classe filha.
  12. A sobrescrita de métodos permite que a classe filha forneça uma implementação específica para um comportamento definido na classe pai.
  13. É possível sobrescrever um método da classe pai se o método da classe pai for final.
  14. A anotação @Override é usada para indicar que um método na classe filha está sobrescrevendo um método da classe pai.
  15. A sobrescrita de métodos é usada principalmente quando se deseja que a classe filha herde o comportamento da classe pai sem alterá-lo.

Gabarito

  1. Verdadeiro: a sobrescrita de métodos ocorre quando uma classe filha redefine um método da classe pai com a mesma assinatura (nome e parâmetros). Isso é feito para modificar ou especificar a implementação do comportamento da classe pai.
  2. Falso: a anotação @Override não é obrigatória, mas ela é fortemente recomendada. Ela ajuda o compilador a verificar se o método da classe filha está realmente sobrescrevendo o método da classe pai, evitando erros caso a assinatura do método não corresponda.
  3. Verdadeiro: a sobrescrita é uma forma de polimorfismo dinâmico, porque o método a ser executado é escolhido em tempo de execução, com base no tipo real do objeto, e não no tipo da variável.
  4. Falso: não é possível sobrescrever um método private, pois ele é inacessível fora da classe onde foi declarado. Métodos private não podem ser sobrescritos pelas subclasses.
  5. Verdadeiro: o tipo de retorno do método sobrescrito deve ser o mesmo ou ser um subtipo do tipo de retorno do método da classe pai, como parte das regras de sobrescrita de métodos.
  6. Verdadeiro: a palavra-chave super pode ser usada para acessar métodos da classe pai, incluindo aqueles que foram sobrescritos pela classe filha, caso seja necessário usar a implementação original.
  7. Falso: a sobrescrita de métodos deve manter a mesma assinatura de método (nome e parâmetros). A lista de parâmetros não pode ser alterada, caso contrário, seria uma sobrecarga, não uma sobrescrita.
  8. Verdadeiro: a anotação @Override é usada para indicar explicitamente que um método está sobrescrevendo um método da classe pai. Isso facilita a leitura e evita erros.
  9. Verdadeiro: a sobrescrita de um método substitui a implementação da classe pai pela nova implementação na classe filha. A implementação original da classe pai não é mais utilizada, a não ser que seja explicitamente chamada com super.
  10. Falso: se o método da classe pai for private, ele não pode ser sobrescrito pela classe filha, pois não é acessível para a classe filha.
  11. Falso: o método original da classe pai ainda pode ser acessado diretamente pela classe filha, mas, quando um método é sobrescrito, a versão sobrescrita será chamada quando o método for invocado.
  12. Verdadeiro: a sobrescrita de métodos permite que a classe filha forneça uma implementação específica para um comportamento já definido na classe pai. Isso permite que a classe filha altere ou estenda o comportamento herdado.
  13. Falso: um método final não pode ser sobrescrito, pois o modificador final impede que o método seja alterado pelas subclasses.
  14. Verdadeiro: a anotação @Override é usada para indicar que um método na classe filha está sobrescrevendo um método da classe pai, garantindo que a sobrescrita está sendo feita corretamente.
  15. Falso: a sobrescrita de métodos é usada quando se deseja que a classe filha modifique ou especifique um comportamento da classe pai. Se não for necessário alterar o comportamento, a classe filha pode simplesmente herdar o método da classe pai.