🚀 Capítulo 10: Herança e Polimorfismo
🎯 Objetivo da Aula
Ao final desta aula, você será capaz de aplicar o conceito de Herança para reaproveitar código entre classes e utilizar o Polimorfismo para fazer com que objetos de diferentes classes respondam ao mesmo comando de formas específicas.
🏢 O Cenário Prático (Seu Desafio)
Você está desenvolvendo um jogo de RPG em Java. O seu desafio é criar uma classe base para todos os personagens do jogo e, a partir dela, criar classes específicas para Guerreiros e Magos. Eles devem compartilhar características comuns (como nome e pontos de vida), mas devem atacar de formas completamente diferentes.
🧠 Fundamentos: A Teoria Traduzida
À medida que criamos mais classes, percebemos que muitas delas compartilham os mesmos atributos e métodos.
- Herança (
extends): Permite que uma classe filha herde todos os atributos e métodos de uma classe mãe. É a relação “é-um”. (Ex: Um Guerreiro é um Personagem). - Polimorfismo: Significa “muitas formas”. É a capacidade de um método com o mesmo nome se comportar de forma diferente dependendo do objeto que o executa. (Ex: O método
atacar()faz o Guerreiro usar a espada e o Mago usar magia).
Hierarquia de Classes
classDiagram class Personagem { +String nome +int hp +atacar() } class Guerreiro { +atacar() } class Mago { +atacar() } Personagem <|-- Guerreiro : Herança Personagem <|-- Mago : Herança
📖 Exemplo Guiado
Vamos criar a estrutura de classes para o nosso RPG.
- Crie o arquivo
Personagem.java(A classe mãe):
public class Personagem {
protected String nome; // 'protected' permite que as classes filhas acessem
protected int hp;
public Personagem(String nome, int hp) {
this.nome = nome;
this.hp = hp;
}
public void atacar() {
System.out.println(nome + " realizou um ataque básico!");
}
}- Crie o arquivo
Guerreiro.java(A classe filha):
public class Guerreiro extends Personagem {
public Guerreiro(String nome, int hp) {
super(nome, hp); // Envia os dados para o construtor da classe mãe
}
// Sobrescrevendo o método atacar (Polimorfismo)
@Override
public void atacar() {
System.out.println(nome + " brandiu sua espada causando dano físico!");
}
}- Crie o arquivo
Jogo.javapara testar o Polimorfismo:
public class Jogo {
public static void main(String[] args) {
Personagem p1 = new Personagem("Plebeu", 100);
Personagem p2 = new Guerreiro("Aragorn", 150); // Polimorfismo!
p1.atacar(); // Executa o método da classe mãe
p2.atacar(); // Executa o método sobrescrito do Guerreiro!
}
}🕹️ Como Executar e Testar no VS Code
- Abra o arquivo
Jogo.java. - Clique em Run logo acima do método
main.
Resultado Esperado:
Plebeu atacou causando 10 de dano!
Aragorn atacou com sua espada causando 30 de dano!🛠️ Prática Obrigatória 1
Crie a classe Mago herdando de Personagem. Sobrescreva o método atacar() para que exiba a mensagem: “[Nome] lançou uma bola de fogo causando dano mágico!“. Teste a criação de um Mago no arquivo Jogo.java e chame o seu ataque.
Resultado Esperado:
| Objeto Criado | Saída Esperada do atacar() |
|---|---|
| Mago “Gandalf” | Gandalf lançou uma bola de fogo causando dano mágico! |
🛠️ Prática Obrigatória 2
Crie uma classe mãe chamada Item com o atributo nome. Crie duas classes filhas: Arma (com o atributo específico dano) e Pocao (com o atributo específico cura). Use a herança e crie os construtores usando o comando super.
Resultado Esperado:
| Classe | Atributos | Comportamento Esperado |
|---|---|---|
Arma | nome=“Espada”, dano=50 | Objeto criado com sucesso usando super |
Pocao | nome=“Poção de Cura”, cura=30 | Objeto criado com sucesso usando super |
📤 Instruções de Entrega (GitHub Desktop + Microsoft Teams)
Neste curso, você entregará suas atividades enviando o código para o seu repositório no GitHub usando o aplicativo GitHub Desktop. Siga o passo a passo detalhado:
- Verifique a estrutura: Certifique-se de que sua estrutura de pastas final está idêntica à mostrada abaixo.
- Abra o GitHub Desktop: Certifique-se de que o repositório do seu curso está selecionado no canto superior esquerdo.
- Visualize as alterações: Na aba Changes (à esquerda), você verá todos os arquivos que criou ou modificou nesta aula.
- Faça o Commit:
- No campo Summary (na parte inferior esquerda), digite uma mensagem curta descrevendo o que fez, ex:
Finaliza atividades do Capítulo 10. - Clique no botão azul Commit to main (ou o nome da sua branch).
- No campo Summary (na parte inferior esquerda), digite uma mensagem curta descrevendo o que fez, ex:
- Envie para a Nuvem (Push): No topo da tela, clique no botão Push origin. Isso enviará seu código do seu computador para o seu perfil no GitHub.
- ⚠️ IMPORTANTE (Repositório Público): Para que o professor consiga corrigir, o seu repositório no GitHub DEVE SER PÚBLICO. Repositórios privados não podem ser visualizados por quem não foi convidado.
- Como entregar no Microsoft Teams:
- Copie o link do seu repositório no GitHub (ex:
https://github.com/seu-usuario/seu-repositorio). - Abra a tarefa correspondente no Microsoft Teams.
- Clique no botão Adicionar trabalho (ou Add work).
- Selecione a opção Link no menu lateral.
- Cole o link do GitHub no campo “Endereço Web” e digite um texto (ex:
Meu Repositório) no campo “Texto a ser exibido”. - Clique em Anexar.
- MUITO IMPORTANTE: Clique no botão Entregar (ou Turn in) no canto superior direito para concluir o envio!
- Copie o link do seu repositório no GitHub (ex:
💡 Checkpoint de Lógica
O que você acabou de fazer é um dos conceitos mais poderosos da POO. O Polimorfismo permite que você trate objetos diferentes como se fossem do mesmo tipo geral (Personagem), facilitando a criação de listas de personagens e a execução de ações em massa sem precisar saber a classe específica de cada um!
🔥 Desafio de Fixação (Opcional)
Crie um vetor do tipo Personagem contendo um objeto de cada classe (Personagem, Guerreiro e Mago). Use um laço for para percorrer o vetor e fazer todos os personagens atacarem em sequência.
🔑 Gabarito de Código/Fórmulas
Prática 1:
public class Mago extends Personagem {
public Mago(String nome, int hp) {
super(nome, hp);
}
@Override
public void atacar() {
System.out.println(nome + " lançou uma bola de fogo causando dano mágico!");
}
}Prática 2:
public class Item {
protected String nome;
public Item(String nome) { this.nome = nome; }
}
public class Arma extends Item {
private int dano;
public Arma(String nome, int dano) {
super(nome);
this.dano = dano;
}
}
public class Pocao extends Item {
private int cura;
public Pocao(String nome, int cura) {
super(nome);
this.cura = cura;
}
}Desafio:
public class Arena {
public static void main(String[] args) {
Personagem[] grupo = new Personagem[3];
grupo[0] = new Personagem("Iniciante", 100);
grupo[1] = new Guerreiro("Conan", 150);
grupo[2] = new Mago("Presto", 80);
System.out.println("--- Rodada de Combate ---");
for (Personagem p : grupo) {
p.atacar(); // Polimorfismo em ação!
}
}
}