Menu
Coddy logo textTech

Sobrescrita de Método (@Override)

Parte da seção Programação Orientada a Objetos do Journey de Java da Coddy. Lição 22 de 87.

Substituição de métodos permite que uma subclasse forneça sua própria implementação de um método que já está definido em sua classe pai. É assim que as classes filhas personalizam o comportamento herdado para atender às suas necessidades específicas.

Quando você sobrescreve um método, a versão da subclasse substitui completamente a versão da classe pai para os objetos dessa subclasse. O método deve ter o mesmo nome e os mesmos parâmetros que o método da classe pai, além de um tipo de retorno igual ao da classe pai (ou um subtipo dele):

public class Animal {
    public void makeSound() {
        System.out.println("Some generic sound");
    }
}

public class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Woof!");
    }
}

public class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Meow!");
    }
}

A anotação @Override informa ao compilador que você pretende substituir um método da classe pai. Embora seja opcional, ela é altamente recomendada porque o compilador detectará erros se você acidentalmente escrever o nome do método incorretamente ou usar parâmetros errados:

@Override
public void makeSound() { }  // Correto - o compilador verifica isso

public void makesound() { }  // Erro de digitação! Cria um novo método em vez de sobrescrever

Quando você chama um método sobrescrito, Java executa a versão que pertence ao tipo real do objeto:

Dog dog = new Dog();
dog.makeSound();  // Saída: Woof!

Cat cat = new Cat();
cat.makeSound();  // Saída: Meow!

Lembre-se da lição anterior de que você pode usar super.methodName() dentro de um método sobrescrito se ainda quiser incluir o comportamento do pai junto com seu novo código.

challenge icon

Desafio

Fácil

Vamos criar um sistema de notificações que demonstra como as subclasses podem substituir métodos da classe pai para fornecer seu próprio comportamento especializado. Você verá como a anotação @Override ajuda a detectar erros e como cada subclasse pode personalizar os métodos herdados.

Você criará três arquivos para organizar seu código:

  • Notification.java: crie a classe pai que representa uma notificação genérica. Ela deve ter:
    • Um campo privado para a message (String)
    • Um construtor que aceite a mensagem
    • Um método getMessage() que retorne a mensagem
    • Um método send() que imprima: Sending notification: [message]
  • EmailNotification.java: crie uma subclasse que estenda Notification e personalize a forma como as notificações são enviadas por e-mail:
    • Um campo privado para o endereço de e-mail do recipient (String)
    • Um construtor que receba a mensagem e o destinatário, usando super(message) para a parte da classe pai
    • Substitua o método send() usando a anotação @Override para imprimir: Emailing [recipient]: [message]
  • Main.java: demonstre como o mesmo nome de método produz comportamentos diferentes dependendo do tipo de objeto. Você receberá duas entradas: uma mensagem e um endereço de e-mail. Crie uma Notification regular e uma EmailNotification com a mesma mensagem e, em seguida, chame send() em cada uma para ver as diferentes saídas.

Você receberá duas entradas: a mensagem (String) e o endereço de e-mail do destinatário (String).

Sua saída deve mostrar duas linhas — primeiro a partir do método send() da classe pai e, depois, a partir da versão substituída em EmailNotification. Isso demonstra como a substituição de métodos permite que as subclasses substituam o comportamento herdado por sua própria implementação.

Experimente você mesmo

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Ler as entradas
        String message = scanner.nextLine();
        String recipient = scanner.nextLine();
        
        // TODO: Create a Notification object with the message
        
        // TODO: Create an EmailNotification object with the message and recipient
        
        // TODO: Call send() on the Notification object
        
        // TODO: Call send() on the EmailNotification object
    }
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de Java online