提问人:StackOverflowed 提问时间:10/31/2013 更新时间:10/31/2013 访问量:367
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实例存在?
答:
1赞
Francis
10/31/2013
#1
虽然 Java 确实是按值传递的,但您必须记住,对于对象,传递的是对象引用的值。
尽管按引用传递和传递引用值之间似乎没有区别,但还是有细微的区别。请参阅 is-java-pass-by-reference 以获取有关该主题的更多内部讨论。
因此,为了回答您的问题,在您的示例中,您将为创建的每个实例创建一个 created 实例。MyClass
OtherClass
至于输入流,由于它是在构造函数中而不是在构造函数中初始化的,因此我们可以假设每次调用时都会打开文件,并且会从文件中读取一个字节。将保持打开状态,但下次调用时,将对新变量的引用分配给成员变量,而旧的变量将被释放以进行垃圾回收。如果没有更多的代码,很难说更多。MyClass.read()
MyClass
read()
InputStream
read()
InputStream
is
创建对象时,将发生以下情况:OtherClass
- 在堆中创建一个新对象,并将对此对象的引用存储在成员变量中。
MyClass
mine
- 构造函数调用该方法。因此,初始化了一个新的字节,并从文件中读取了第一个字节。
MyClass
read()
InputStream
- 构造函数调用该方法。因此,初始化了一个新的字节,并从文件中读取了第一个字节。
- 构造函数调用 。因此,初始化了一个新的字节,并从文件中读取了第一个字节。
OtherClass
mine.read()
InputStream
- 将创建一个新对象。对存储在变量中的对象的引用值将传递给构造函数。
LastClass
MyClass
mine
- 引用的此副本保存在新对象的成员变量中。
MyClass
his
LastClass
- 构造函数调用 。因此,初始化了一个新的字节,并从文件中读取了第一个字节。
LastClass
mine.read()
InputStream
- 引用的此副本保存在新对象的成员变量中。
评论