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:
- Criação de Objetos: Instâncias de Filme e Serie são criadas.
- 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.
- Adição de Elementos: Os objetos filme1, serie1, filme2 e serie2 são adicionados ao ArrayList.
- 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.
- 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.
- 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.
- 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().
- 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().