I always wondered why people do this, Set s = new HashSet() or Set s = new TreeSet() etc...Since I am readin and workin on collections now, I think it's because maybe later on if we want some additional methods from TreeSet which are not there in the HashSet, all we need to do is change new HashSet() to TreeSet() right? The code will not break and we need not do more work where as if we do, HashSet s = new HashSet() we need to change it on the left and on the right hand side too. Am I correct?
Hi, Its all about polymorphism. Any variable of type superclass or interface which is implemented by a class (in this case interface Set implemented by TreeSet or HashSet) can refer to any object which implements Set i.e., Set a=new TreeSet(); "a" is a variable of type Set and refering to object of type TreeSet. Here variable "a" is set to be polymorphic, i.e the ability to refer to more than one subclass or class which implements Set interface. One of the feature of polymorphism is to provide the ristricted access to subclass objects. Here using variable "a" you can access only the methods which are declared in the interface Set. In case of class, you can access only the overriden methods.
Just to throw it in here.... this is also an example of what you might see called "coding to an interface". For instance, Hashtable, HashMap, TreeMap all implement the Map interface. The Map interface specifies the basic methods required to use a collection that implements map. That said, if you write your code using the methods specified by the interface then, at "run time", that reference variable can hold any collection that implements Map. So any of the above three collection types could be "plugged into" that reference and it would work.
SCJP - 86% - June 11, 2009