There is nothing to explain for the left hand side of the assignment, the compiler requires that the declaration be final, be either a primitive type or a string, and be initialized during the declaration.
For the right hand side -- the expression that will be assigned -- it's a bit more complex. The compiler requires that it be assigned a constant expression. If the RHS is not a constant expression, then the declared variable is not a compile time constant.
See section 15.28, for the definition of constant expression: