The rules are pretty simple:
You can't instantiate an interface or abstract class.
You can store an instantiated object in a type that is:
a) itself
b) its parent
c) any interface implemented by itself
d) any interface implemented by its parent
Knowing that let's look at Marcus's example:
1 is an example of b - Object is the parent of CFace
2 is an example of b - Base is the parent of ObRef
3 is an error because you are storing an object in a variable that is its child type
4 is an example of b - Object is the parent of Base
Remember, Object is the parent of everything in
Java.