在下面的类中,我将一个字符串添加到Vector(v1),然后将该Vector(v1)添加到一个新的Vector(v2)。然后我重新初始化Vector v1。
java如何保留对v1的引用?当我重新注册v1是java在引擎盖下维护一个引用?
以下输出为“1”。
public class VectorTest {
public static void main(String args[]){
new VectorTest().testVector();
}
private void testVector(){
Vector v1 = new Vector();
Vector v2 = new Vector();
v1.add("1");
v2.add(v1);
v1 = new Vector();
Vector v3 = (Vector)v2.get(0);
System.out.println(v3.elementAt(0));
}
}
答案 0 :(得分:4)
private void testVector(){
Vector v1 = new Vector(); // v1 references some vector created on the heap
Vector v2 = new Vector();
v1.add("1"); // vector referenced by v1 gets a "1" added
v2.add(v1); // make v2[0] the second referrer to that Vector you created
v1 = new Vector(); // Change what v1 refers to, this is not the same as destroying the original Vector
// v2[0] still holds a reference to the original vector
Vector v3 = (Vector)v2.get(0); // v3 is now another referrer to the same vector
System.out.println(v3.elementAt(0));
}
您正在更改v1
引用的内容,在本例中为其他Vector
。但v2
仍然保留对原始Vector
的引用。
Java中的对象可以有多个引用它的变量。 Vector
个对象也是可变的,这意味着如果其中一个引用者修改它,就像你一样:
v1.add("1");
然后,每个其他引用者现在将引用其中包含"1"
的相同向量。
您还可以更改变量引用的对象,就像您在此处一样:
v1 = new Vector();
所以在那之后,v1
对不同的Vector
对象保持不同的引用,而v2[0]
(借助数组表示法)仍然保留对原始{{1}的引用。您在开头创建并分配到Vector
。
v1
执行此操作时,您将Vector v3 = (Vector)v2.get(0);
引用您在开头创建的v3
,因此此时此对象有两个引用:
Vector
v2[0]
我尝试绘制一些原始图像来演示这一点,但我认为从Java教程中读取有关对象和引用的页面会更容易:
http://download.oracle.com/javase/tutorial/java/javaOO/objectcreation.html
答案 1 :(得分:1)
当你这样做时:
v1 = new Vector();
现在发生的事情是v1现在指向另一个对象,但是旧的向量也被v2引用(因为你已经添加了它)。
Java不会释放该对象,直到消除了对它的所有引用(粗略地说)。
答案 2 :(得分:1)
如果您希望v1.clear()
重新初始化,请使用v2.get(0)
,尽管这里没有意义。
正如birryree所评论的那样,你改变了v1的引用,对象本身不受new Vector()
赋值的影响。
答案 3 :(得分:1)
我会注释你的代码:
public class VectorTest {
public static void main(String args[]){
new VectorTest().testVector();
}
private void testVector(){
Vector v1 = new Vector(); // Create a new vector as v1
Vector v2 = new Vector(); // Create a new vector as v2
v1.add("1"); // Add the string "1" as an element in v1
v2.add(v1); // Add whatever is inside v1 to v2.
v1 = new Vector(); // Dispose old v1, get a new vector as v1
// THIS HAS NO EFFECT ON v2
Vector v3 = (Vector)v2.get(0); // Get the 0th item from v2 as a new vector v3.
System.out.println(v3.elementAt(0));
}
正如我所提到的,处理v1(当你为它获得一个新的Vector时)不会影响你对v2所做的事情。
}