当我重新初始化向量时,为什么它保持其值

时间:2011-10-13 20:25:37

标签: java

在下面的类中,我将一个字符串添加到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));
    }

}

4 个答案:

答案 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,因此此时此对象有两个引用:

  1. Vector
  2. v2[0]

  3. 我尝试绘制一些原始图像来演示这一点,但我认为从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所做的事情。

}