At compile time , references are checked , but at run time actuall objects are checked .
here is an example .
class A
{
A()
{ }
}
class B extends A
{
}
class C extends A
{
}
class D
{
public static void main(
String[] arg)
{
A a = new C();
B b = ( B ) a ;
}
in this at run time th reference are only checked , since a is typecasted , shows no error at compile time , but at run time u r objects are created , and C's object is getting assigned to B's reference , hence fails at run time .
As a simple rule , at compile time th reference are checked , actual object are created at run time .