我在理解非静态变量的处理方式时遇到问题。我选择使用数组,以便轻松检索其内存地址。
考虑以下代码:
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();
}
}
为了了解 vector 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
我对很多事情很不解,首先就是为什么在静态方法main()
中调用obj.v
的引用是一样的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);
}
}
最佳答案
为什么在静态方法main()中调用obj.v的引用与在非静态方法met()中调用v的引用相同?
答案:因为你没有将它重新分配给内存中的不同对象。它仍然指向内存中的同一个“数组”对象,即使您在内部更改了数组的内容。
看看你的代码,加上我的评论:
public class tryClass
{
// here, non-static variable v will be instantiated
// as an array with a length of one, holding the value 0 in it's one slot;
// it will be instantiated when an instance of tryClass is created.
int[] v = {0};
// here, this tryClass has another tryClass named "obj" in it as one of its fields.
tryClass obj;
public void met ()
{
// here, the tryClass's tryClass obj is instantiated
// and this second tryClass's "v" is instantiated
// and then it's one slot is set to 30.
obj = new tryClass();
obj.v[0] = 30;
// now, the first tryClass's "v" is set to 3.
v[0]=3;
}
public static void main (String[] args)
{
// creating a new tryClass. This is NOT the same object as in met.
// But it CONTAINS the same object in met.
// You could call it by going obj.obj.
tryClass obj = new tryClass(); // is this the SAME object as in met() ? Answer: No.
// this does nothing, it just creates another int[] v
// that exists only inside the main() method. It is not
// the same as obj.v!
int[] v = new int[1];
// changing the contents of obj.v, but not reassigning obj.v itself.
obj.v[0] = 40;
// calling met, which will change obj.v's contents again, but not reassign it.
obj.met();
}
}
数组是可变的,这意味着即使它在内存中保持相同的对象,它的内容也可以改变。
关于java - java如何处理非静态变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19162283/