Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Static block in Java not executed

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?

like image 382
Sthita Avatar asked May 31 '13 09:05

Sthita


People also ask

Do you know static block in Java when is it getting executed?

Static block in java is executed every time when a class loads. This is also known as Static initialization block. Static block in java initializes when class load into memory , it means when JVM read the byte code.

How many times static block is executed in Java?

Therefore, only one time static block will be executed. Note: Instance block and constructor both are executed during the object creation but instance block will execute first before the execution of the constructor during the object creation.

Can Java be executed without main if it has static block?

Yes, we can execute a java program without a main method by using a static block. Static block in Java is a group of statements that gets executed only once when the class is loaded into the memory by Java ClassLoader, It is also known as a static initialization block.

How many times non-static block will execute?

Whenever an object is created, a non-static block will be executed before the execution of the constructor.


1 Answers

  1. A static final int field is a compile-time constant and its value is hardcoded into the destination class without a reference to its origin;
  2. therefore your main class does not trigger the loading of the class containing the field;
  3. therefore the static initializer in that class is not executed.

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.

like image 181
Marko Topolnik Avatar answered Sep 22 '22 20:09

Marko Topolnik