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.

A sobrescrita de método (method overriding) 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 objetos dessa subclasse. O método deve ter o mesmo nome, tipo de retorno e parâmetros que o método pai:

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 sobrescrever um método pai. Embora opcional, é fortemente recomendada porque o compilador capturará erros se você acidentalmente escrever incorretamente o nome do método 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, o 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 que você pode usar super.methodName() dentro de um método sobrescrito se você ainda quiser incluir o comportamento do pai junto com seu novo código.

challenge icon

Desafio

Fácil

Vamos construir um sistema de notificação que demonstra como as subclasses podem sobrescrever métodos da classe pai para fornecer seu próprio comportamento especializado. Você verá como a anotação @Override ajuda a captar erros e como cada subclasse pode personalizar 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 aceita a mensagem
    • Um método getMessage() que retorna a mensagem
    • Um método send() que imprime: Sending notification: [message]
  • EmailNotification.java: Crie uma subclasse que estende Notification e personaliza como as notificações são enviadas via e-mail:
    • Um campo privado para o endereço de e-mail do recipient (String)
    • Um construtor que recebe tanto a mensagem quanto o destinatário, usando super(message) para a parte da classe pai
    • Sobrescreva 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 tanto uma Notification regular quanto uma EmailNotification com a mesma mensagem, então 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 do método send() da classe pai, depois da versão sobrescrita em EmailNotification. Isso demonstra como a sobrescrita de métodos permite que as subclasses substituam o comportamento herdado por sua própria implementação.

Folha de consulta

A sobrescrita de método (method overriding) permite que uma subclasse forneça sua própria implementação de um método que já foi definido em sua classe pai. O método sobrescrito deve ter o mesmo nome, tipo de retorno e parâmetros que o método pai.

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!");
    }
}

A anotação @Override é opcional, mas fortemente recomendada. Ela informa ao compilador que você pretende sobrescrever um método pai, ajudando a detectar erros como nomes de métodos digitados incorretamente ou parâmetros incorretos:

@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

Ao chamar um método sobrescrito, o Java executa a versão que pertence ao tipo real do objeto:

Dog dog = new Dog();
dog.makeSound();  // Output: Woof!

Cat cat = new Cat();
cat.makeSound();  // Output: Meow!

Você pode usar super.methodName() dentro de um método sobrescrito para incluir o comportamento do pai junto com seu novo código.

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: Criar um objeto Notification com a mensagem
        
        // TODO: Criar um objeto EmailNotification com a mensagem e o destinatário
        
        // TODO: Chamar send() no objeto Notification
        
        // TODO: Chamar send() no objeto EmailNotification
    }
}
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