🚀 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.

  1. 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!");
    }
}
  1. 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!");
    }
}
  1. Crie o arquivo Jogo.java para 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

  1. Abra o arquivo Jogo.java.
  2. 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 CriadoSaí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:

ClasseAtributosComportamento Esperado
Armanome=“Espada”, dano=50Objeto criado com sucesso usando super
Pocaonome=“Poção de Cura”, cura=30Objeto 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:

  1. Verifique a estrutura: Certifique-se de que sua estrutura de pastas final está idêntica à mostrada abaixo.
  2. Abra o GitHub Desktop: Certifique-se de que o repositório do seu curso está selecionado no canto superior esquerdo.
  3. Visualize as alterações: Na aba Changes (à esquerda), você verá todos os arquivos que criou ou modificou nesta aula.
  4. 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).
  5. 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.
  6. ⚠️ 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.
  7. 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!

💡 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!
        }
    }
}

Capitulo Anterior | Proximo Capitulo