Java uses static binding to determine what overloaded version of a method needs to be called, and it uses dynamic binding to determine what overridden version of a method needs to be called.
The static binding that the compiler does is the same for your two examples, because the argument list of the call to
show() hasn't changed. The dynamic binding that the virtual machine does is also the same for your two examples, because the runtime type of the object you're calling
show() on hasn't changed.
In short, your examples don't demonstrate any kind of
polymorphism, except that you can assign a reference of a subtype to a variable of a supertype.
The advantage of using variables of the least specific type that you need is that you can easily change the runtime type of the object it references, without having to change the type of the variable itself.