Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Desafio instanceof

Primeiro, vamos definir as classes Titulo, Filme e Serie para simular o cenário:

Java

// Titulo.java
public class Titulo {
    private String nome;

    public Titulo(String nome) {
        this.nome = nome;
    }

    public String getNome() {
        return nome;
    }

    public void exibirInformacoes() {
        System.out.println("Título: " + nome);
    }
}

// Filme.java
public class Filme extends Titulo {
    private int duracaoEmMinutos;

    public Filme(String nome, int duracaoEmMinutos) {
        super(nome);
        this.duracaoEmMinutos = duracaoEmMinutos;
    }

    public int getDuracaoEmMinutos() {
        return duracaoEmMinutos;
    }

    @Override
    public void exibirInformacoes() {
        System.out.println("Filme: " + getNome() + " (" + duracaoEmMinutos + " min)");
    }
}
// Serie.java
public class Serie extends Titulo {
    private int temporadas;
    private int episodiosPorTemporada;

    public Serie(String nome, int temporadas, int episodiosPorTemporada) {
        super(nome);
        this.temporadas = temporadas;
        this.episodiosPorTemporada = episodiosPorTemporada;
    }

    public int getTemporadas() {
        return temporadas;
    }

    public int getEpisodiosPorTemporada() {
        return episodiosPorTemporada;
    }

    @Override
    public void exibirInformacoes() {
        System.out.println("Série: " + getNome() + " (" + temporadas + " temporadas, " + episodiosPorTemporada + " episódios por temporada)");
    }
}

Agora, a classe Main (ou Teste) onde faremos o ArrayList e o loop foreach com instanceof: Java

import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        // Criando instâncias de Filme e Serie
        Filme filme1 = new Filme("Matrix", 136);
        Filme filme2 = new Filme("O Senhor dos Anéis: A Sociedade do Anel", 178);
        Serie serie1 = new Serie("Stranger Things", 4, 9);
        Serie serie2 = new Serie("Breaking Bad", 5, 10);

        // Criando um ArrayList de Titulos e adicionando os objetos
        ArrayList<Titulo> listaDeTitulos = new ArrayList<>();
        listaDeTitulos.add(filme1);
        listaDeTitulos.add(serie1);
        listaDeTitulos.add(filme2);
        listaDeTitulos.add(serie2);

        System.out.println("--- Percorrendo a lista de títulos ---");

        // Percorrendo o ArrayList usando foreach e utilizando instanceof
        for (Titulo item : listaDeTitulos) {
            // Chamando o método exibirInformacoes polimorficamente
            item.exibirInformacoes();

            // Verificando se o item é uma instância de Filme
            if (item instanceof Filme) {
                // Realizando o casting para Filme
                Filme filme = (Filme) item;
                System.out.println("  É um filme! Duração: " + filme.getDuracaoEmMinutos() + " minutos.");
            }
            // Verificando se o item é uma instância de Serie
            else if (item instanceof Serie) {
                // Realizando o casting para Serie (apenas para demonstrar que funcionaria)
                Serie serie = (Serie) item;
                System.out.println("  É uma série! Temporadas: " + serie.getTemporadas());
            }
            System.out.println("------------------------------------");
        }
    }
}

Explicação do código Main:

  1. Criação de Objetos: Instâncias de Filme e Serie são criadas.
  2. ArrayList listaDeTitulos: É declarado um ArrayList que pode armazenar objetos do tipo Titulo ou de qualquer uma de suas subclasses (Filme, Serie). Isso demonstra o polimorfismo.
  3. Adição de Elementos: Os objetos filme1, serie1, filme2 e serie2 são adicionados ao ArrayList.
  4. Loop foreach (for (Titulo item : listaDeTitulos)):
  • Para cada item na listaDeTitulos, o loop executa o bloco de código.
  • Cada item é inicialmente tratado como um objeto do tipo Titulo.
  1. item.exibirInformacoes();: Aqui ocorre o polimorfismo.
  • Embora item seja do tipo Titulo, o Java chama a implementação correta do método exibirInformacoes() (seja de Filme, Serie ou Titulo base) com base no tipo real do objeto em tempo de execução.
    
  1. if (item instanceof Filme):
  • Esta é a parte crucial. instanceof verifica se o objeto referenciado por item é uma instância da classe Filme (ou de uma subclasse de Filme, se houvesse).
  • Se for true, significa que item realmente aponta para um objeto Filme.
  1. Filme filme = (Filme) item;:
  • Somente se instanceof Filme retornar true, o casting é realizado de forma segura.
  • Isso converte a referência item (que era do tipo Titulo) para o tipo Filme, permitindo acessar métodos específicos da classe Filme, como getDuracaoEmMinutos().
  1. else if (item instanceof Serie):Da mesma forma, verifica se o item é uma Serie. Se for true, o casting para Serie é feito, permitindo acessar métodos como getTemporadas().
1 resposta
solução!

Oii, Daiane!

Obrigada por compartilhar seu código.

Você usou polimorfismo com instanceof de maneira clara e eficiente. A estrutura que criou para distinguir entre filmes e séries tá muito bem aplicada, mostrando domínio da herança e da verificação de tipo em tempo de execução.

Uma dica interessante para o futuro é criar um método exibirTipo() diretamente nas subclasses, evitando o uso de instanceof em alguns cenários. Veja um exemplo:


@Override
public void exibirInformacoes() {
    super.exibirInformacoes();
    System.out.println("Tipo: Filme");
}

Dessa forma, o comportamento específico pode ser definido em cada classe, mantendo o código mais coeso e polimórfico.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!