public class Arcane {
static int x;
int y;
public Arcane(int x) {
int y = x + 1;
this.y = y;
}
public void increment() {
y += x;
}
public void print() {
System.out.println(y);
}
public static void main(String[] args) {
x = 5;
{
int x = 2;
Arcane t = new Arcane(x);
t.increment();
t.print();
}
}
}
It is in my understanding that the program prints out 8 but I cannot figure out why. I tried plugging in x=5.
First you put 5 to static variable x: x = 5;
Then you create yet another x valid in inner scope. Its value is 2 and you send it to constructor of Arcane that calculates y
as x+1
(local x), i.e. 2+1=3
.
At this point
static x = 5;
y = 3;
Now you call increment that calculates new value of y
as y+=x
, that is exactly as y = y + x
,. i.e. 3+5=8
.
Then you print y that holds 8.
I hope this helps.
public static void main(String[] args) {
x = 5; // static x is 5
{
int x = 2; //local x is 2
Arcane t = new Arcane(x); //new arcane with local x = 2
t.increment(); // add static x (5) to field y which is 3, = 8
t.print(); //print 8
}
}
public Arcane(int 2) {
int 3 = 2 + 1;
this.y = 3;
}
public void increment() {
y += 5; // from static int x -> 8
}
When you do this following, you're passing x=2;
Arcane t = new Arcane(2);
Then in the constructor, the value of y becomes. y=2+1=3
public Arcane(int x) { int y = x + 1; this.y = y; }
Back in your main method, the following method call assigns the value of y=x+y which is 5+3=8
t.increment();
thats why.
static int x;
is a static variable, the line:
x = 5;
modify this static variable.
int x = 2;
is a shadow variable, needless to say, not affecting the static one initialized early. an object is created passing the shadowed variable.
at this point y = 2 + 1 = 3.
t.increment()
changes the value of y to 3 + 5.
at this point you got y = 8 as the final result, its all about scoping and shadowing, basic programming concept you need to get familiarized with.