First of all, let's discuss what a "forward reference" is and why it is bad. A forward reference is a reference to a variable that has not yet been initialized, and it is not confined only to static initalizers. These are bad simply because, if allowed, they'd give us unexpected results. Take a look at this bit of code:
public class ForwardRef {
    int a = b; // <--- Illegal forward reference
    int b = 10;
}
What should j be when this class is initialized? When a class is initialized, initializations are executed in order the first to the last encountered. Therefore, you'd expect the line 
a = b; 
to execute prior to: 
b = 10; 
In order to avoid this kind of problems, Java designers completely disallowed such uses of forward references. 
EDIT
this behaviour is specified by section 8.3.2.3 of Java Language Specifications:
The declaration of a member needs to appear before it is used only if the member is an instance (respectively static) field of a class or interface C and all of the following conditions hold:
- The usage occurs in an instance (respectively static) variable initializer of C or in an instance (respectively static) initializer of C. 
- The usage is not on the left hand side of an assignment. 
- C is the innermost class or interface enclosing the usage. 
A compile-time error occurs if any of the three requirements above are not met.