class arijit
{
public static void main(String args[])
{
System.out.println(\"Base class main\");
amit ab=new amit(); //how is it possible as the sub class object a
Perhaps you need to distinguish compile time from runtime.
At compile time the structure of arijit is well-known. It does not matter that halfway in the class, in main, a subclass is used, as that is a runtime thing.
But I admit, the Java compiler is not all that stupid :)