J.K
J.K

Reputation: 2393

Why code in static block does not execute?

When I print the constant in main, the static block does not execute, but when I print stat, it does execute. Is there any importance to static final in Java?

package com.test.doubt;

class Doubt {

  public static final int constant = 123;
  public static int stat = 123;

  static {
    System.out.println("Static Block");
  }
}

public class MyProgram {

  public static void main(String[] args) {
    System.out.println(Doubt.constant);
  }
}

Upvotes: 9

Views: 2395

Answers (2)

Brian Agnew
Brian Agnew

Reputation: 272417

The static final int will get compiled directly into your code as its value. That is to say, the JVM sees and is executing:

System.out.println(123);

and you're not touching your aptly-named Doubt class at all (this is an argument for not specifying constants in this fashion, btw. If you change that value you have to recompile every referencing class)

Upvotes: 11

Jon Skeet
Jon Skeet

Reputation: 1503839

Your code isn't initializing the Doubt class, precisely because Doubt.constant is a constant. Its value is baked into MyProgram at compile-time - you could even delete Doubt.class after compilation and your program would still run.

Run

javap -c com.test.doubt.MyProgram

to have a look at exactly what your code looks like after compilation.

See section 15.28 of the JLS for what constitutes a constant expression. For example, this would still be a constant:

public static final String FOO = "Foo";

and so would all of these:

public static final String FOO = "Foo";
public static final String BAR = "Bar";
public static final String FOOBAR = FOO + BAR;

... but this wouldn't be

public static final String NOT_A_CONSTANT = "Foo".substring(0, 1);

Upvotes: 21

Related Questions