What is the point in having something like this:
List<String> listName = new ArrayList<String>();
I believe this is polymorphism, but what advantage does that give you?
Like Cero said, it allows you to use a LinkedList or some other class that extends List without changing anything but the creation code. However, in the case of List, different implementations have widely different performance characteristics. Therefore there aren't many opportunities to take advantage of this, as you'll want to optimize your gets and add/sets depending on what kind of List you used in the first place.
I don't know how much knowledge you have of Java (or object oriented programming), but take a look at this example:
Weapon weapon = new Dagger();
In this case, it is obvious that the weapon can be swapped for a completely different kind of weapon (like a Sword, Bow, Shotgun, PortableDeathStar, e.t.c.
), so it is important that the weapon variable can hold all different weapons in the game, or you'll have to make an endless if-else chain to find which weapon you have equipped, and/or other terrible hacks.