Interfaces and abstract classes can never be instantiated. What you can do as you have in your example is to instantiate a concrete class but assign the resulting object to an interface.
Consider the following class hierarchy:
IBlah
^
|
AbstractBlah
^
|
BlahImpl
If IBlah is an interface and AbstractBlah is an abstract class and BlahImpl is a concrete class, the following lines of code are all invalid:
IBlah blah1 = new IBlah();
IBlah blah2 = new AbstractBlah();
AbstractBlah blah3 = new AbstractBlah();
The following lines of code are both valid:
IBlah blah1 = new BlahImpl();
AbstractBlah blah3 = new BlahImpl();
So you can only instantiate concrete a class but the variable you assign that to can be any super-type (a parent class or interface implemented by the class) of the concrete class.
You can refer to and use the concrete class through the interface or abstract class variable. In fact this is actually encouraged as programming to an abstract class (or interface) makes your code more flexible.
It is possible to create a concrete class from an interface or abstract class in in-place. So if we have an interface like this:
interface IBlah {
void doBlah();
}
That interface could be implemented and instantiated in one fell swoop like so:
IBlah blah = new IBlah() {
public void doBlah() {
System.out.println("Doing Blah");
}
};