2013-07-27 113 views
0

如果兩個相同類型的對象具有相同的參考,會發生什麼情況?具有相同參考變量的對象

對於如 -

BufferedReader bufferedReader=null; 
try{ 
    bufferedReader = new BufferedReader(new InputStreamReader(a.openStream())); 
    while ((inputLine = bufferedReader.readLine()) != null) { 
     //do something 
    } 

    bufferedReader = new BufferedReader(new InputStreamReader(b.openStream())); 
    while ((inputLine = bufferedReader.readLine()) != null) { 
     //do something 
    } 
} 

ab在這種情況下是網址。

我這裏的代碼類似於this page。在這種情況下,緩衝的閱讀器對象首先將具有URL a的數據,以及後面的數據b

+0

你指的是哪一個「相同的參考變量」? –

+0

1)爲了更快地獲得更好的幫助,請發佈[SSCCE](http://sscce.org/)。 2)對代碼塊使用一致的邏輯縮進。代碼的縮進旨在幫助人們理解程序流程。 –

+0

是的,先a然後b,連接到a的閱讀器將丟失參考並在第一個while循環退出時獲取垃圾收集 – arynaq

回答

1

我不認爲你說過你的問題意味着你真正想問什麼。要回答您未知的問題...

您有參考bufferedReader類型BufferedReader

在第一行,你初始化參考null。它不指向一個對象。

第4行中,更改其中bufferedReader參考點。它現在指向一個最終從a獲取數據的對象。

一行7更改其中bufferedReader參考點。它現在指向一個最終從b獲取數據的對象。

緩衝的讀者對象首先會得到URL a的數據,然後b的數據會被緩存,

是的,您的代碼將從URL a檢索數據,然後從URL b檢索數據。


如果同一類型的兩個對象具有相同的參考會發生什麼?

這將是更喜歡:

Foo o1 = new Foo(); 
Foo o2 = o1; 

現在,o1o2指向同一個對象。在這種情況下,通過任一引用調用方法都會影響同一個(單個)對象。

+0

太棒了。非常感謝你。 – rickygrimes

1

這不過是類似這樣的, 讓我來解釋給簡單的例子,你將能夠然後映射你的情況。

int a = 10; 

a = 2 + 3 ; 
sysout(a); 
// a have 5 right now, next line will change the contents to 9, 
    so previous data within a is no longer exist. 

a = 4 + 5 ; 
sysout(a); 

用戶定義類型

class Student{ 
    private int rollNo; 
//getter-setter 
} 

Student s = new Student(); 
s.setRollNo(10); 

sysout(s.getRollNo); 

現在,你正在創造新的Student對象相同的參考,然後引用以前的學生都將丟失,你的引用將開始指向新的Student對象。

s = new Student(); 
s.setRollNo(20); 

sysout(s.getRollNo); 
0

相同的變量(的BufferedReader)指的是一個對象的第一「新」,那麼它重新分配給在第二個「新」的第二,不同的對象之後。

還值得注意的是,Java垃圾收集器將釋放未使用的對象...但它不會關閉仍然打開的文件。第二個「新」引入了資源泄漏;)

0

想想這樣 - 每次你調用new關鍵字時,你都在調用它的對象類的構造函數。這爲您在堆上創建了一個新的對象。因此,在上面的代碼片段中,您已經完成了兩次,首先初始化鏈接爲流式傳輸的BufferedReader()對象,請參閱bufferedReader引用。一旦while循環完成並且您點擊下一個新的關鍵字,就會創建另一個BufferedReader鏈接到流b的對象,現在您的bufferedReader引用句柄指向該句柄。

Java具有自動垃圾收集功能,一次只能指向一個堆上的一個對象(甚至一個Array被認爲是它自己的對象)。因此,一旦將鏈接到a的BufferedReader對象的引用切換到鏈接到b的引用,前一個就會被垃圾回收。

記住,左側是聲明,如: Object obj1; 的右側是調用創建所提供的類型的新對象,例如: obj1 = new Object(); 將讓您的OBJ1參考點到之間的equals在堆上新創建的對象。希望有所幫助。