class Test {
public static void main(String arg[]) {
System.out.println("**MAIN METHOD");
System.out.println(Mno.VAL); // SOP(9090);
System.out.println(Mno.VAL + 100); // SOP(9190);
}
}
class Mno {
final static int VAL = 9090;
static {
System.out.println("**STATIC BLOCK OF Mno\t: " + VAL);
}
}
I know that a static
block executed when class loaded. But in this case the instance variable inside class Mno
is final
, because of that the static
block is not executing.
Why is that so? And if I would remove the final
, would it work fine?
Which memory will be allocated first, the static final
variable or the static
block?
If due to the final
access modifier the class does not get loaded, then how can the variable get memory?
static final int
field is a compile-time constant and its value is hardcoded into the destination class without a reference to its origin; In specific detail, the compiled bytecode corresponds to this:
public static void main(String arg[]){
System.out.println("**MAIN METHOD");
System.out.println(9090)
System.out.println(9190)
}
As soon as you remove final
, it is no longer a compile-time constant and the special behavior described above does not apply. The Mno
class is loaded as you expect and its static initializer executes.