例如:
/**
* Constructor
*/
public Test(InputStream in){
try{
this.inputStream = in;
} finally{
inputStream.close();
}
}
创建 Test 对象后,传递给讲师的 InputStream 是否立即关闭?还是在 Test 对象被销毁时关闭?我不知道如何在 C++ 中实现类似于析构函数的东西。
例如:
/**
* Constructor
*/
public Test(InputStream in){
try{
this.inputStream = in;
} finally{
inputStream.close();
}
}
创建 Test 对象后,传递给讲师的 InputStream 是否立即关闭?还是在 Test 对象被销毁时关闭?我不知道如何在 C++ 中实现类似于析构函数的东西。
它作为构造函数的一部分执行。在构造函数中执行的代码只是普通代码——那里没有奇怪的控制流。(我的意思是在调用超类构造函数以及运行变量/实例初始化程序之后。)
Java 中没有与 C++ 析构函数等效的东西。您将获得的最接近的是finalizer,但不应将其用作 C++ 析构函数的等价物。(您几乎不应该编写终结器。在某些情况下,它们不会在关闭时被调用,并且它们被称为非确定性的。)
在您给出的情况下,您可能不希望您的类承担关闭输入流的责任 - 通常打开流的代码也负责关闭它。但是,如果您确实想为此负责,或者只是让调用者更容易,您可能希望公开一个close()
仅关闭流的方法。您可能也想实现AutoCloseable
,以便调用者可以在您的类中使用try-with-resources 语句:
try (Test test = new Test(new FileInputStream("foo.txt")) {
// Do stuff with test
}
这将test.close()
在块的末尾自动调用try
。
finally 会在 try 后立即执行。它在构造函数中并不重要。它在JLS中有很好的定义。
它说:
通过首先执行 try 块来执行带有 finally 块的 try 语句。然后有一个选择:
- 如果try块的执行正常完成,则执行finally块,然后有一个选择:
- 如果 finally 块正常完成,则 try 语句
正常完成。- 如果 finally 块由于原因 S 突然完成,则 try 语句由于原因 S 突然完成。