Ravi and Arpana,
Thanks for the replies.
Arpana,
I tried to use your explanation to find out whether it works for objects.
class A {}
class B extends A {}
class C
{
public static void main (
String [] args)
{
//according to you, at this point the compiler knows a is pointing to a B instance
final A a = new B();
//so I expect the following assignment to work without a cast
B b = a; //but compiler complains ???