Downcasting e UpCasting

Eu tenho um código em Java que estou praticando downcasting/upcasting, mas dá erro
Eu criei as classes
//public class Animal {
public void fazBarulho() {
System.out.println(“Faz Barulho”);
}
}
public class Cat extends Animal{
@Override
public void fazBarulho() {
System.out.println(“Miau”);
}
}
public class Dog extends Animal{
@Override
public void fazBarulho() {
System.out.println(“Au au au”);
}
}
//na main eu realizei o seguinte:
public static void main(String[] args) {

	Dog dog = new Dog();
	Animal animal = new Animal();
	Animal animal2 = new Dog();
	Animal animal3 = new Cat();
	dog.fazBarulho();
	animal.fazBarulho();
	animal2.fazBarulho();
	animal3.fazBarulho();
	System.out.println("-- CASTING --");
	Cat siames = (Cat) animal; //Esse comando gera o erro pois quero fazer um downcasting e ver se o resultado sai como "Fazer barulho" ou "Miau"
	siames.fazBarulho()

Exception in thread “main” java.lang.ClassCastException: class entities.Animal cannot be cast to class entities.Cat (entities.Animal and entities.Cat are in unnamed module of loader ‘app’)
at application.MainExemploAnimal.main(MainExemploAnimal.java:20)

A variável animal foi inicializada assim:

Animal animal = new Animal();

Ou seja, a variável animal não aponta para um objeto do tipo Cat, então não pode fazer cast.

A única variável que você pode fazer cast para Cat é a animal3.

Entendi. Obrigado