Shadowing instance variables with local variables in Java

I have read that " a variable is shadowed if there is another variable with the same name that is closer in scope". I found this Point class with a constructor as an example:

public class Point {
    public int x = 0;
    public int y = 0;

    public Point(int x, int y) {
        x = x;
        y = y;
    }
}

Then I created an object of the Point class in the CreateObjectDemo class below and printed the value of the variable x.

public class CreateObjectDemo {
    public static void main(String[] args) {

    Point originOne = new Point(23, 94);

    System.out.println(originOne.x);

    }

}

After running the compiler, it prints 0. But why doesn't it print 23? I thought that "x = x" in the constructor would be like "23 = 23". Did I misunderstand the definition of shadowing variables?

Jon Skeet
people
quotationmark

I thought that "x = x" in the constructor would be like "23 = 23".

Within the constructor, the meaning of the simple name x is always just the parameter. So the assignment x = x in the constructor takes the value of the x parameter and assigning it to the x parameter as well. The instance variable is never touched. (It's not clear what you mean by 23 = 23;, so I can't tell whether or not that's accurate.) Basically, this is a no-op and some IDEs will give you a warning about it.

To force it to copy to the instance variable, you want:

this.x = x;

(And likewise for y, of course.)

people

See more on this question at Stackoverflow