Java/Android - 在资源打开的情况下将对象传递给方法
Posted
技术标签:
【中文标题】Java/Android - 在资源打开的情况下将对象传递给方法【英文标题】:Java/Android - Passing objects to methods with resources open 【发布时间】:2013-11-10 22:21:26 【问题描述】:假设我有一个类包含对从文件读取的 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 实例?
【问题讨论】:
【参考方案1】:虽然 Java 确实是按值传递的,但您必须记住,对于对象,传递的是对象引用的值。
虽然传递引用和传递引用的值之间似乎没有区别,但它们是细微的区别。有关该主题的更深入讨论,请参阅 is-java-pass-by-reference。
因此,为了回答您的问题,在您的示例中,您将为您创建的每个 OtherClass
实例创建一个 MyClass
实例。
对于输入流,由于它是在MyClass.read()
而不是MyClass
构造函数中初始化的,那么我们可以假设每次调用read()
都会打开文件,并从中读取一个字节文件。 InputStream
将保持打开状态,但下次调用 read()
时,将对新 InputStream
的引用分配给 is
成员变量,旧的将被释放以进行垃圾收集。如果没有更多代码,很难说更多。
当您创建 OtherClass
对象时,会发生以下情况:
MyClass
对象,并且对该对象的引用存储在mine
成员变量中。
MyClass
构造函数调用read()
方法。因此初始化一个新的InputStream
,并从文件中读取第一个字节。
OtherClass
构造函数调用mine.read()
。因此初始化一个新的InputStream
,并从文件中读取第一个字节。
创建了一个新的LastClass
对象。对存储在变量mine
中的MyClass
对象的引用值被传递给构造函数。
MyClass
引用的这个副本保存在新的LastClass
对象的his
成员变量中。
LastClass
构造函数调用mine.read()
。因此初始化一个新的InputStream
,并从文件中读取第一个字节。
【讨论】:
以上是关于Java/Android - 在资源打开的情况下将对象传递给方法的主要内容,如果未能解决你的问题,请参考以下文章
如何在不打开另一个窗口的情况下将 PowerPoint 演示文稿嵌入到 WPF 应用程序中?
如何在不打开另一个应用程序的情况下将数据从一个应用程序传递到另一个应用程序?