4

非静的変数の処理方法を理解するのに問題があります。メモリアドレスを簡単に取得できるように、配列を使用することにしました。

次のコードを検討してください。

public class tryClass
{
    int[] v = {0}; // vector v is non-static (and NOT local to any method)
    tryClass obj;
    public void met ()
    {
        obj = new tryClass();
        obj.v[0] = 30;
        v[0]=3;
    }
    public static void main (String[] args)
    {
        tryClass obj = new tryClass(); // is this the SAME object as in met() ?
        int[] v = new int[1];
        obj.v[0] = 40;
        obj.met();
    }
}

各ステップでベクトルがどのようにv処理されるかを知るために、コードにいくつかのprintln命令を入力しました。出力は次のとおりです。

In main(), BEFORE running met()
    obj.v[0] = 40
    obj.v    = [I@78456a0c

INSIDE method met()
    obj.v[0] = 30
    v[0]     = 3
    obj.v    = [I@15357784
    v        = [I@78456a0c

In main(), AFTER running met()
    obj.v[0] = 3
    obj.v    = [I@78456a0c

私は多くのことに非常に戸惑っています.1つ目は、静的メソッドでobj.v呼び出されたときの参照が非静的メソッド内の参照main()と同じである理由です。さらに、オブジェクトなしで呼び出された場合 (もちろん、非静的コンテキストで) は正確には何ですか?vmet()v

私はJavaが初めてで、本当に無限の質問があります。答えがそれらを完全に解決できることを願っています...ご協力いただきありがとうございます。

完全を期すために、完全なコードは次のとおりです。

public class tryClass
{
    int[] v = {0};
    tryClass obj;
    public void met ()
    {
        obj = new tryClass();
        obj.v[0] = 30;
        v[0]=3;
        System.out.println("\nINSIDE method met()");
        System.out.println("\tobj.v[0] = "+obj.v[0]);
        System.out.println("\tv[0]     = "+v[0]);
        System.out.println("\tobj.v    = "+obj.v);
        System.out.println("\tv        = "+v);
    }
    public static void main (String[] args)
    {
        tryClass obj = new tryClass();
        int[] v = new int[1];
        obj.v[0] = 40;
        System.out.println("In main(), BEFORE running met()");
        System.out.println("\tobj.v[0] = "+obj.v[0]);
        System.out.println("\tobj.v    = "+obj.v);
        obj.met();
        System.out.println("\nIn main(), AFTER running met()");
        System.out.println("\tobj.v[0] = "+obj.v[0]);
        System.out.println("\tobj.v    = "+obj.v);
    }
}
4

3 に答える 3

1

static main メソッドを実行するとき、最初に tryClass のインスタンスを作成し、そのインスタンスの属性である v という配列の 1 つの要素の値を出力します。(obj.v[0])。次に、そのインスタンスのメソッド met を呼び出すため、そのメソッドの本体の非静的参照は、そのインスタンスの属性 (メイン メソッドで作成したもの) を参照します。

于 2013-10-03T15:01:49.890 に答える