2011-10-13 52 views
0

在下面的類中,我將一個字符串添加到向量(v1),然後將該向量(v1)添加到一個新的向量(v2)。然後我重新初始化Vector v1。當我重新初始化一個向量爲什麼它保持其值

java如何保留對v1的引用?當我重新initalise 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)); 
    } 

} 
+1

您改變了'v1'的引用,但這與'v2'持有對'v1'引用的相同'Vector'的引用是分開的。另外,如果你還沒有使用泛型,你可能需要研究一下。 – birryree

+0

我想你喜歡探索事物......但Java是驚人的不是它......無論你做什麼它處理它......對這個問題+1沒想到它可能會以這種方式... – amod

回答

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](原諒數組符號)仍然提到您創建並在開始時分配給v1的原始Vector


Vector v3 = (Vector)v2.get(0); 

當你這樣做,你讓v3是指您在創建之初一樣Vector,所以在這一點上有兩個引薦給該對象:

  1. v2[0]
  2. v3

我想嘗試畫一些原油圖片證明這一點,但我覺得它更容易只是從Java教程的對象和引用閱讀此頁:如果你想

http://download.oracle.com/javase/tutorial/java/javaOO/objectcreation.html

+0

*** v2.add(V1); //使v2成爲您創建的Vector的第二個引薦者*** 如果這不是 - v2.add(v1); //將新的Vector v1添加到Vector v2? –

+0

@ user470184 - 是的,對不起,編輯了代碼註釋以表明這一點。 'v2 [0]'(比說'v2'的第一個元素容易)將會得到一個與'v1'指向的同一個向量的引用。 – birryree

+0

太好了,謝謝你的詳細解答。 –

1

當你這樣做:

v1 = new Vector(); 

什麼情況是,V1現在指向另一個對象,但舊的載體也由V2引用(因爲你已經添加的話)。

Java不會釋放對象,直到所有對它的引用都被刪除(粗略地說)。

1

使用v1.clear()v2.get(0)將被重新初始化,儘管在這裏沒什麼意義。 正如birryree所說,您更改了v1的引用,該對象本身不受new Vector()賦值的影響。

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做了什麼。

} 
相關問題