Это полиморфизм, вы переопределили метод, поэтому теперь, когда вы вызываете этот метод для этого объекта, даже если он приведен к суперклассу, будет вызываться самый дочерний метод.
Тем не менее, пример того, где upcasting делает разницу, здесь:
class MyClass {
static void doSomething(Apple apple) { System.out.println("Apple"); }
static void doSomething(RedApple apple) { System.out.println("RedApple"); }
}
...
RedApple apple = new RedApple();
MyClass.doSomething(apple);
MyClass.doSomething((Apple)apple);
Выход:
RedApple
Apple
Так как мы передали его в Apple, наилучшим подходящим методом является метод с параметром Apple.