I'd just like to point out two quick things:
b=1;//Compile-time error
This is a compile error because you can't reference an instance variable in a static block; it's not really related to the final issue.
a=2;// Will give compile error
ALL final variables can only be initialized once, but you don't have to provide an initializer when you declare them. However, with a static final, by the time an instance method is invoked on the object (ie, an actual instance of the object is created via new) the static final variable will have been initialized with its default value (for an int, zero) by the classloader, so you cannot re-assign a different value later like in this method.
This implies that if you want your static final variables to have non-default values, you only have two choices:
1. Provide an initializer when you declare it (this is the common case)
2. Provide a static initilizer block that assigns the value. This is useful in the case where calculating the initial value is non-trivial, or dependant on the run-time environment.