Escreva uma classe abstrata chamada CartaoWeb. Essa classe representa todos os tipos de cartões web e conterá apenas um atributo: destinatario (tipo String). Nessa classe você deverá também declarar o método public abstract void showMessage(). Crie classes filhas da classe CartaoWeb: DiaDosNamorados, Natal, Aniversario. Cada uma dessas classes deve conter um método construtor que receba o nome do destinatário do cartão. Cada classe também deve implementar o método showMessage(), mostrando uma mensagem ao usuário com seu nome e que seja específica para a data de comemorativa do cartão. Escreva um programa e no método main crie um array de CartaoWeb. Insira instâncias dos 3 tipos de cartões neste array. Após, use um laço for para exibir as mensagens deste cartão chamando o método showMessage().

Passo 1

O enunciado pede que eu implemente uma hierarquia de classes em Java para cartões web com as seguintes exigências:
  • Criar uma classe abstrata chamada CartaoWeb que contém apenas um atributo: destinatario (tipo String).
  • Declarar em CartaoWeb o método abstrato público public abstract void showMessage().
  • Criar três classes filhas de CartaoWeb: DiaDosNamorados, Natal e Aniversario.
  • Cada subclasse deve ter um construtor que receba o nome do destinatário e inicialize o atributo correspondente.
  • Cada subclasse deve implementar showMessage() exibindo uma mensagem personalizada para o destinatário e específica ao tipo de cartão.
  • Escrever um programa com main que:
    • Crie um array de CartaoWeb.
    • Insira instâncias dos três tipos de cartões nesse array.
    • Percorra o array com um laço for e chame showMessage() para exibir as mensagens.
Informações relevantes fornecidas pelo enunciado:
  • Nome da classe base: CartaoWeb.
  • Atributo obrigatório: destinatario do tipo String.
  • Método obrigatório: public abstract void showMessage().
  • Três subclasses obrigatórias: DiaDosNamorados, Natal, Aniversario.
  • Cada subclasse precisa de um construtor que recebe o nome do destinatário.
  • No main, usar um array de CartaoWeb com as três instâncias e mostrar as mensagens via laço.

Passo 2

Antes de codificar, vou explicar conceitos Java necessários, de forma simples e prática (para você usar na prova):
  • O que é uma classe abstrata?
    • Uma classe abstrata é uma classe que pode conter métodos abstratos (sem implementação) e/ou métodos com implementação. Não é possível instanciar diretamente uma classe abstrata (ou seja, new numa classe abstrata dá erro). Usamos classes abstratas quando queremos definir um contrato comum e forçar as subclasses a implementarem certos métodos.
    • No nosso caso, CartaoWeb será abstrata porque define o método showMessage() sem implementação, e cada tipo de cartão fará sua própria mensagem.
  • O que é herança (extends)?
    • Herança permite que uma classe (subclasse) reutilize código de outra classe (superclasse). Em Java, usamos class Sub extends Super.
    • As subclasses herdam atributos e métodos (visíveis) da superclasse.
  • Modificador de acesso do atributo destinatario:
    • Para que as subclasses possam inicializar o atributo de forma limpa, vamos torná-lo protected. protected permite acesso nas subclasses do mesmo pacote. Outra opção seria private com um construtor ou setter em CartaoWeb, mas usar protected String destinatario simplifica e é aceitável para exercícios didáticos.
  • Construtor da superclasse e super(...):
    • Se criarmos um construtor em CartaoWeb que recebe o destinatario, as subclasses podem chamar super(destinatario) no próprio construtor para inicializar o atributo. Isso é boa prática.
  • Polimorfismo e arrays de tipo base:
    • Um array de CartaoWeb[] pode armazenar objetos de qualquer subclasse. Ao chamar showMessage() sobre uma referência do tipo CartaoWeb, a JVM escolherá a implementação concreta da subclasse (polimorfismo dinâmico). Isso permite escrever um único laço for que chama showMessage() e cada cartão mostra sua mensagem específica.
  • Como exibir no console:
    • Em Java usamos System.out.println(...) para imprimir linhas no console. No showMessage() usaremos isso para exibir as mensagens.

Passo 3

Vamos projetar a classe abstrata CartaoWeb. Regras que vou seguir:
  • Ter o atributo destinatario como protected String destinatario;.
  • Ter um construtor public CartaoWeb(String destinatario) para inicializar.
  • Declarar o método abstrato public abstract void showMessage();.
Exemplo de código da classe abstrata (explicando linha a linha):
  • abstract class CartaoWeb declara que a classe é abstrata.
  • protected String destinatario; armazena o nome do destinatário, visível para subclasses.
  • public CartaoWeb(String destinatario) { this.destinatario = destinatario; } inicializa o atributo.
  • public abstract void showMessage(); obriga as subclasses a implementar esse método.

Passo 4

Agora as subclasses: DiaDosNamorados, Natal e Aniversario.
  • Cada uma vai estender CartaoWeb.
  • Cada construtor terá a assinatura public NomeDaClasse(String destinatario) e fará super(destinatario).
  • Cada showMessage() usará System.out.println(...) para mostrar uma mensagem personalizada contendo o valor de destinatario.
  • Exemplos de mensagens (você pode ajustar o texto na prova, o importante é chamar System.out.println com o nome):
    • DiaDosNamorados: “Feliz Dia dos Namorados, <destinatario>! Que o amor esteja sempre presente.”
    • Natal: “Feliz Natal, <destinatario>! Boas festas e muita paz.”
    • Aniversario: “Feliz Aniversário, <destinatario>! Muitas felicidades e saúde.”
Vou exemplificar como fica uma dessas subclasses explicando um pouco:
  • class Natal extends CartaoWeb declara que Natal é subclasse.
  • public Natal(String destinatario) { super(destinatario); } chama o construtor da superclasse para inicializar o nome.
  • public void showMessage() { System.out.println("Feliz Natal, " + destinatario + "! Boas festas e muita paz."); } implementa a mensagem específica.

Passo 5

Programa principal (main) e uso do array:
  • No main criaremos CartaoWeb[] cartas = new CartaoWeb[3];
  • Inserimos:
    • cartas[0] = new DiaDosNamorados("Ana");
    • cartas[1] = new Natal("Bruno");
    • cartas[2] = new Aniversario("Carla");
  • Em seguida usamos um laço for para percorrer o array e chamar showMessage():
    • for (CartaoWeb c : cartas) { c.showMessage(); }
  • Isso demonstra polimorfismo: o tipo do array é CartaoWeb[], mas cada elemento é um objeto de uma subclasse diferente; ao chamar showMessage() a implementação correta para cada objeto será executada.

Passo 6

Dicas de prova e observações finais (curtas e úteis):
  • Lembre-se que não se pode instanciar CartaoWeb com new CartaoWeb(...) porque é abstrata.
  • Use protected se quiser acesso direto nas subclasses; se preferir encapsulamento total, deixe private e forneça um getter, mas aí as subclasses precisariam do getter para ler destinatario.
  • Em provas, escreva o código com atenção aos modificadores (public, abstract, extends, super) — erros nesses pontos são comuns.
  • Teste localmente compilando com javac e executando com java para garantir que as mensagens aparecem como esperado.

Resposta

public class Main {
    public static void main(String[] args) {
        CartaoWeb[] cartas = new CartaoWeb[3];
        cartas[0] = new DiaDosNamorados("Ana");
        cartas[1] = new Natal("Bruno");
        cartas[2] = new Aniversario("Carla");

        for (CartaoWeb c : cartas) {
            c.showMessage();
        }
    }
}

abstract class CartaoWeb {
    protected String destinatario;

    public CartaoWeb(String destinatario) {
        this.destinatario = destinatario;
    }

    public abstract void showMessage();
}

class DiaDosNamorados extends CartaoWeb {
    public DiaDosNamorados(String destinatario) {
        super(destinatario);
    }

    @Override
    public void showMessage() {
        System.out.println("Feliz Dia dos Namorados, " + destinatario + "! Que o amor esteja sempre presente.");
    }
}

class Natal extends CartaoWeb {
    public Natal(String destinatario) {
        super(destinatario);
    }

    @Override
    public void showMessage() {
        System.out.println("Feliz Natal, " + destinatario + "! Boas festas e muita paz.");
    }
}

class Aniversario extends CartaoWeb {
    public Aniversario(String destinatario) {
        super(destinatario);
    }

    @Override
    public void showMessage() {
        System.out.println("Feliz Aniversário, " + destinatario + "! Muitas felicidades e saúde.");
    }
}

Exercícios relacionados