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
mainque:- Crie um array de
CartaoWeb. - Insira instâncias dos três tipos de cartões nesse array.
- Percorra o array com um laço
fore chameshowMessage()para exibir as mensagens.
- Crie um array de
Informações relevantes fornecidas pelo enunciado:
- Nome da classe base: CartaoWeb.
- Atributo obrigatório:
destinatariodo tipoString. - 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 deCartaoWebcom 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,
newnuma 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,
CartaoWebserá abstrata porque define o métodoshowMessage()sem implementação, e cada tipo de cartão fará sua própria mensagem.
- 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,
-
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.
- Herança permite que uma classe (subclasse) reutilize código de outra classe (superclasse). Em Java, usamos
-
Modificador de acesso do atributo
destinatario:- Para que as subclasses possam inicializar o atributo de forma limpa, vamos torná-lo
protected.protectedpermite acesso nas subclasses do mesmo pacote. Outra opção seriaprivatecom um construtor ou setter emCartaoWeb, mas usarprotected String destinatariosimplifica e é aceitável para exercícios didáticos.
- Para que as subclasses possam inicializar o atributo de forma limpa, vamos torná-lo
-
Construtor da superclasse e
super(...):- Se criarmos um construtor em
CartaoWebque recebe odestinatario, as subclasses podem chamarsuper(destinatario)no próprio construtor para inicializar o atributo. Isso é boa prática.
- Se criarmos um construtor em
-
Polimorfismo e arrays de tipo base:
- Um array de
CartaoWeb[]pode armazenar objetos de qualquer subclasse. Ao chamarshowMessage()sobre uma referência do tipoCartaoWeb, a JVM escolherá a implementação concreta da subclasse (polimorfismo dinâmico). Isso permite escrever um único laçoforque chamashowMessage()e cada cartão mostra sua mensagem específica.
- Um array de
-
Como exibir no console:
- Em Java usamos
System.out.println(...)para imprimir linhas no console. NoshowMessage()usaremos isso para exibir as mensagens.
- Em Java usamos
Passo 3
Vamos projetar a classe abstrata
CartaoWeb. Regras que vou seguir:- Ter o atributo
destinatariocomoprotected 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 CartaoWebdeclara 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 dedestinatario. - Exemplos de mensagens (você pode ajustar o texto na prova, o importante é chamar
System.out.printlncom 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 CartaoWebdeclara 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
maincriaremosCartaoWeb[] 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
forpara percorrer o array e chamarshowMessage():for (CartaoWeb c : cartas) { c.showMessage(); }
- Isso demonstra polimorfismo: o tipo do array é
CartaoWeb[], mas cada elemento é um objeto de uma subclasse diferente; ao chamarshowMessage()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
CartaoWebcomnew CartaoWeb(...)porque é abstrata. - Use
protectedse quiser acesso direto nas subclasses; se preferir encapsulamento total, deixeprivatee forneça um getter, mas aí as subclasses precisariam do getter para lerdestinatario. - 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
javace executando comjavapara 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.");
}
}