Java/Android - 在打开资源的情况下将对象传递给方法

Java/Android - Passing objects to methods with resources open

提问人:StackOverflowed 提问时间:10/31/2013 更新时间:10/31/2013 访问量:367

问:

假设我有一个类,它包含对从文件中读取的 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 Android 参数传递 引用

评论


答:

1赞 Francis 10/31/2013 #1

虽然 Java 确实是按值传递的,但您必须记住,对于对象,传递的是对象引用的值。

尽管按引用传递和传递引用值之间似乎没有区别,但还是有细微的区别。请参阅 is-java-pass-by-reference 以获取有关该主题的更多内部讨论。

因此,为了回答您的问题,在您的示例中,您将为创建的每个实例创建一个 created 实例。MyClassOtherClass

至于输入流,由于它是在构造函数中而不是在构造函数中初始化的,因此我们可以假设每次调用时都会打开文件,并且会从文件中读取一个字节。将保持打开状态,但下次调用时,将对新变量的引用分配给成员变量,而旧的变量将被释放以进行垃圾回收。如果没有更多的代码,很难说更多。MyClass.read()MyClassread()InputStreamread()InputStreamis

创建对象时,将发生以下情况:OtherClass

  • 在堆中创建一个新对象,并将对此对象的引用存储在成员变量中。MyClassmine
    • 构造函数调用该方法。因此,初始化了一个新的字节,并从文件中读取了第一个字节。MyClassread()InputStream
  • 构造函数调用 。因此,初始化了一个新的字节,并从文件中读取了第一个字节。OtherClassmine.read()InputStream
  • 将创建一个新对象。对存储在变量中的对象的引用值将传递给构造函数。LastClassMyClassmine
    • 引用的此副本保存在新对象的成员变量中。MyClasshisLastClass
    • 构造函数调用 。因此,初始化了一个新的字节,并从文件中读取了第一个字节。LastClassmine.read()InputStream