Hi,
First of all, I guess, you need to go through the chapter 4 in detail once more. Or refer to JLS "Conversions and Promotions" for detailed explanations regarding this. Anyway, I have provided a summary for all your questions here:
1. Conversion from any subclass reference to its superclass reference is possible without casting.For eg.,
String s=new String("Hello");
Object o=s;//ok
2. Conversion from any reference object to its implementing interface is possible without casting. For eg.,
Thread t=new Thread();
Runnable r=t;//ok because, Thread class implements Runnable Interface
3. Any reference object can be assigned the null parameter.
String s=null;
4. A reference of type Object can be assigned anything, viz., any class reference, any interface type or any array reference
eg.,
String s=new String();
Object o=s;
o=Runnable r;
int a[]={1,2,3};
o=a;
All the above are possible without a cast.
5. An array reference can be assigned to the interface Cloneable since any type of array is considered to implement the interface "Cloneable".
int a[]={1,2,3};
Cloneable c=a;//Ok
Runnable r=a;//Wrong!
Anything other than the above would result in a compile-time error in case an explicit cast is not provided in some of these cases.
Hope it is clear now.
Aparna R