非静的変数の処理方法を理解するのに問題があります。メモリアドレスを簡単に取得できるように、配列を使用することにしました。
次のコードを検討してください。
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()
と同じである理由です。さらに、オブジェクトなしで呼び出された場合 (もちろん、非静的コンテキストで) は正確には何ですか?v
met()
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);
}
}