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.

Method overriding permite que uma subclasse forneça sua própria implementação de um method que já está definido em sua classe parent. É assim que as classes filhas personalizam o behavior herdado para atender às suas necessidades específicas.

Quando você faz overriding de um method, a versão da subclasse substitui completamente a versão do parent para object dessa subclasse. O method deve ter o mesmo nome e os mesmos parâmetros que o method do parent, e um tipo de retorno que seja igual ao do parent (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 @Override annotation informa ao compiler que você pretende fazer overriding de um parent method. Embora opcional, ela é altamente recomendada, porque o compiler detectará erros se você acidentalmente escrever o nome do method incorretamente ou usar parâmetros errados:

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

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 substituído se ainda quiser incluir o comportamento do parent 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 parent 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 parent que representa uma notification generic. Ela deve ter:
    • Um field private para message (String)
    • Um constructor que accepts a message
    • Um method getMessage() que retorna a message
    • Um method send() que prints: Sending notification: [message]
  • EmailNotification.java: Crie uma subclasse que extends Notification e personaliza como as notifications são enviadas por email:
    • Um field private para o endereço de email do recipient (String)
    • Um constructor que recebe tanto a message quanto o recipient, usando super(message) para a parte da classe parent
    • Faça o overriding do method send() usando a anotação @Override para prints: Emailing [recipient]: [message]
  • Main.java: Demonstre como o mesmo nome de method produz um behavior diferente dependendo do tipo de object. Você receberá dois inputs: uma message e um endereço de email. Crie uma Notification regular e uma EmailNotification com a mesma message e, em seguida, faça um send() em cada uma para ver os diferentes outputs.

Você receberá dois inputs: a message (String) e o endereço de email do recipient (String).

Seu output deve mostrar duas linhas — primeiro a partir do method send() da classe parent e depois a partir da versão overriding em EmailNotification. Isso demonstra como o overriding de methods permite que as subclasses substituam o behavior 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