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?
Static methods are the methods in Java that can be called without creating an object of class. They are referenced by the class name itself or reference to the Object of that class.
We can call a static method by using the ClassName. methodName. The best example of the static method is the main() method. It is called without creating the object.
Anonymous class is an inner class which does not have a name and whose instance is created at the time of the creation of class itself and these classes are somewhat different from normal classes in its creation.
Java doesn't have standalone functions at all.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With