簡體   English   中英

Java / Android-在資源打開的情況下將對象傳遞給方法

[英]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對象。 存儲在變量mineMyClass對象的引用值將傳遞給構造函數。
    • MyClass引用的此副本保存在新的LastClass對象的his成員變量中。
    • LastClass構造函數調用mine.read() 因此,將初始化一個新的InputStream並從文件中讀取第一個字節。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM