Qual é a necessidade de usar o Upcasting em java?

Examinei a maioria dos jornais da rede, mas ainda não consigo entender por que precisamos usar upcastin

class Animal 
{ 
    public void callme()
    {
        System.out.println("In callme of Animal");
    }
}

class Dog extends Animal 
{ 
    public void callme()
    {
        System.out.println("In callme of Dog");
    }

    public void callme2()
    {
        System.out.println("In callme2 of Dog");
    }
}

public class UseAnimlas 
{
    public static void main (String [] args) 
    {
        Dog d = new Dog();      
        Animal a = (Animal)d;
        d.callme();
        a.callme();
        ((Dog) a).callme2();
    }
}

Você pode considerar este exemplo para upcasting. Para que serve upcasting aqui? Ambosd ea dando a mesma saída!

questionAnswers(8)

yourAnswerToTheQuestion