Ham.java demonstrates that when you declare and instantiate a collection that the parameter types must match exactly. However, once the collection has been instantiated you can add elements that are types or subtypes of the parameter type at will. It also demonstrates that object type determines which version of a non-static method will be invoked, but reference variable type determines which version of a static method will be invoked. StaticMethods.java does a clearer job of showing how polymorphism works with static and non-static methods. Remember that reference variable type matters for static methods and instance or object type matters for non-static methods.