我有問題了解處理非靜態變量的方式。我選擇了使用數組,以便輕鬆地檢索其內存地址。java如何處理非靜態變量?
考慮下面的代碼:
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 = [[email protected]
INSIDE method met()
obj.v[0] = 30
v[0] = 3
obj.v = [[email protected]
v = [[email protected]
In main(), AFTER running met()
obj.v[0] = 3
obj.v = [[email protected]
我很困惑許多事情,其中第一個是爲什麼在靜態方法main()
中調用時參考obj.v
與v
在非靜態內部相同hod 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);
}
}
您已經創建了instanceof tryClass。因此,無論您是使用Main方法還是使用類方法打印,您都會從該「實例」obj中打印「數組」參考,因此也會引用相同的參考 – Optional
瞭解靜態方法和類以及使用靜態和實例時字段範圍的工作方式領域。這裏有一個提示:嘗試將你的(靜態)「main」方法放在一個單獨的類中(稱爲Start或某個東西),並讓你的「tryClass」免於使用。這樣可以看出爲什麼(靜態)方法本地字段與(非靜態)實例字段無關:(http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html我也認爲給出一些你熟悉的其他語言的細節可能會幫助那些會回答你的人。 –
請注意,正如@ShivanDragon所說的,非靜態變量更適合稱爲實例字段(同樣適用於方法)。 – LexLythius