繁体   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