It seems this is defined in the spec (See JLS 8.3.2.3):
The declaration of a member needs to appear textually 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.
The usage is via a simple name.
C is the innermost class or interface enclosing the usage.
So if the usage is on the left hand side of an assignment, then it is legal, since the second one does not hold anymore.