Reputation: 8564
for the following code:
class A
{
public static int X;
static { X = B.Y + 1;}
}
public class B
{
public static int Y = A.X + 1;
static {}
public static void main(String[] args) {
System.out.println("X = "+A.X+", Y = "+B.Y);
}
}
the output is:
X = 1, Y = 2
Why? And How?
P.S: Code snippet taken from JavaCamp.org
Upvotes: 17
Views: 5152
Reputation: 421040
Here is what happens in chronological order:
Class B
contains the main-method so it is loaded by the class loader.
Initialization of B
references A
, so class A
is loaded.
A
has a static variable X
initialized to B.Y + 1
.
The initialization of B.Y
hasn't been executed yet, so B.Y
evaluates to 0, and thus 1 is assigned to A.X
Now A
has finished loading, and the initialization of B.Y
can take place.
The value of A.X + 1
(1 + 1) is assigned to B.Y
.
The values of A.X
and B.Y
are printed as 1
and 2
respectively.
Java Language Specification, §12.4.1 When Initialization Occurs
Upvotes: 27
Reputation: 340793
This is only my guess:
B
is loaded because it contains main
which you have requested to be executed.B
requires A
to operate (it uses A
by accessing its static field)B
is loaded.A
requires class B
which happens to be already loaded, but not yet initializedA
carelessly loads B.Y
(initialized to 0 by that time by default), since the class looks like loaded (language design flaw?)A.X = 0 + 1
A
is now loaded, class loader can continue to load and initialize B
B.Y = 1 + 1
.Upvotes: 3
Reputation: 6841
B being public starts to load itself.
Sees A.X = B.Y +1 == which is 0 to start with (default int object value) hence 1;
initializes B = 1 + 1 = 2;
hence the answer.
Upvotes: 0