[英]Java/Android - Passing objects to methods with resources open
假設我有一個類,其中包含對正在從文件讀取的InputStream或正在寫入文件的OutputStream的引用(或另一個示例,如果您是Android開發人員,則為MediaPlayer實例)。
知道Java是按值傳遞對象的,那么當您遇到以下偽代碼時會發生什么?
class MyClass {
InputStream is;
public void read() {
// initialize inputstream here (assume it's reading from a file that contains the alphabet from A-z)
is.read();
}
public MyClass() {
this.read();
}
}
class OtherClass {
MyClass mine = new MyClass();
public OtherClass() {
mine.read();
LastClass lastClass = new LastClass(mine);
}
}
class LastClass {
MyClass his;
public LastClass(MyClass mc) {
his = mc;
his.read();
}
}
我的問題是,由於我們要按值傳遞對象,因此它們如何能夠維護對開放資源的引用? 另外,需要明確的是,在執行所有操作時,存在多少個MyClass實例?
雖然Java確實是按值傳遞的,但是您必須記住,對於對象,傳遞的是對象引用的值。
盡管“按引用傳遞”和“傳遞引用值”之間似乎沒有區別,但它們是微妙的區別。 有關該主題的更深入的討論,請參見is-java-pass-by-reference 。
因此,為了回答您的問題,在您的示例中, OtherClass
您創建的OtherClass
每個實例創建一個MyClass
實例。
至於輸入流,由於它是在MyClass.read()
而不是在MyClass
構造函數中初始化的,因此我們可以假定每次調用read()
時都會打開文件,並且將從文件中讀取一個字節。 InputStream
將保持打開狀態,但是下次調用read()
,將對is
成員變量分配對新InputStream
的引用,並將舊的引用釋放以進行垃圾回收。 沒有更多的代碼,很難說更多。
當您創建OtherClass
對象時,將發生以下情況:
MyClass
對象,對該對象的引用存儲在mine
成員變量中。
MyClass
構造函數調用read()
方法。 因此,將初始化一個新的InputStream
並從文件中讀取第一個字節。 OtherClass
構造函數調用mine.read()
。 因此,將初始化一個新的InputStream
並從文件中讀取第一個字節。 LastClass
對象。 存儲在變量mine
的MyClass
對象的引用值將傳遞給構造函數。
MyClass
引用的此副本保存在新的LastClass
對象的his
成員變量中。 LastClass
構造函數調用mine.read()
。 因此,將初始化一個新的InputStream
並從文件中讀取第一個字節。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.