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

プログラムが 8 を出力することは理解していますが、その理由はわかりません。x=5 を入れてみました。

4

5 に答える 5

2

まず、静的変数 x に 5 を入れます。x = 5;

次に、内部スコープで有効なさらに別の x を作成します。その値は 2 であり、 (ローカル x)yとして計算する Arcane のコンストラクターに送信します。この時点でx+12+1=3

static x = 5;
y = 3;

yここで、 asの新しい値を計算する increment を呼び出します。y+=xこれは正確に asy = y + xです。すなわち3+5=8

次に、8 を保持する y を出力します。

これが役立つことを願っています。

于 2012-05-01T16:10:26.273 に答える
1
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
    }
}
于 2012-05-01T16:10:29.900 に答える
0
public Arcane(int 2) {
     int 3 = 2 + 1;
     this.y = 3;
}

public void increment() {
    y += 5; // from static int x -> 8
}
于 2012-05-01T16:13:28.353 に答える
0

これを次のように行うと、x=2; が渡されます。

Arcane t = new Arcane(2);

次に、コンストラクターで、y の値は次のようになります。y=2+1=3

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

メイン メソッドに戻ると、次のメソッド呼び出しで y=x+y の値が割り当てられます。これは 5+3=8 です。

t.インクリメント();

于 2012-05-01T16:18:07.087 に答える
0

それが理由です。

静的 int x;

は静的変数で、次の行です。

x = 5;

この静的変数を変更します。

int x = 2;

言うまでもなく、シャドウ変数であり、初期化された静的変数には影響しません。シャドウされた変数を渡してオブジェクトが作成されます。
この時点で y = 2 + 1 = 3 です。

t.インクリメント()

y の値を 3 + 5 に変更します。
この時点で、最終結果として y = 8 が得られました。これはすべて、スコープとシャドーイングに関するものであり、慣れる必要がある基本的なプログラミングの概念です。

于 2012-05-01T16:18:44.497 に答える