The only thing that overloaded methods have in common is their name. You have simply added a new method to your subclass that doesn't exist in the superclass. Since the method that takes a String parameter is defined only for the Dog class, you have to have the correct reference type (Dog) to call it. This would be no different from adding a Dog.bark() method: you couldn't doBy the way, why AnimalSound rather than Animal? Is a Dog a more specific type of AnimalSound?
In contrast, overriding a method is adding a method with the exact same signature (return type and parameter types and order). This way, when you call the method, the runtime type of the object determines which method is executed.
Using of a subclass by using it's superclass reference is needed when you know _what_ will subclass do, but don't know _how_. In your example: You know that all animals scream (AnimalSound.scream()), but you don't know how. You also know, that dogs are animals, so they should scream. You can do something like this:
Methods public void scream() and public void scream(String s) are not related. I mean, they related as any other couple of methods. (public void A() public void B(String s)).