Calling a Java method with no name

david99world picture david99world · Dec 4, 2012 · Viewed 10.2k times · Source

I'm looking at the code below and found something a bit strange:

public class Sequence {
    Sequence() {
        System.out.print("c ");
    }

    {
        System.out.print("y ");
    }

    public static void main(String[] args) {
        new Sequence().go();
    }

    void go() {
        System.out.print("g ");
    }

    static {
        System.out.print("x ");
    }
}

I would've expected this to give a compilation error as the System.out with "y " doesn't belong to a method declaration just a { }. Why is this valid? I don't see how this code would or should be called.

When running this it produces x y c g also, why does the static { } get called before the sequence constructor?

Answer

jlordo picture jlordo · Dec 4, 2012

This:

static {
        System.out.print("x ");
    }

is a static initialization block, and is called when the class is loaded. You can have as many of them in your class as you want, and they will be executed in order of their appearance (from top to bottom).

This:

    {
        System.out.print("y ");
    }

is an initialization block, and the code is copied into the beginning of each constructor of the class. So if you have many constructors of your class, and they all need to do something common at their beginning, you only need to write the code once and put it in an initialization block like this.

Hence your output makes perfect sense.

As Stanley commented below, see the section in the Oracle tutorial describing initializaiton blocks for more information.