Variable Scope Example Explanation

2019-09-20 01:36发布

问题:

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.

回答1:

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.



回答2:

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
    }
}


回答3:

public Arcane(int 2) {
     int 3 = 2 + 1;
     this.y = 3;
}

public void increment() {
    y += 5; // from static int x -> 8
}


回答4:

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();



回答5:

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.



标签: java scope