Coming to the third case ie
public static final SizeClass INSTANCE = new SizeClass(10);
private static final int MAX_SIZE = 1000;
Here again the initialization from top to bottom rule applies but with a small change. Since MAX_SIZE is assigned with a finite value rather than some method call initialization, so it will be initialized before INSTANCE. Thus again the o/p will be "Size is 990".
By the above statement do you mean in case when a finite value is assigned to a static final vaiable then the top to bottom rule of initialization is not applicable. Because if it is applicable there would be still forward referencing in the constructor.. Please explain