在Java中,何时执行构造函数中的最后一个块?

在Java中,何时执行构造函数中的最后一个块?,java,constructor,try-finally,Java,Constructor,Try Finally,例如: /** * Constructor */ public Test(InputStream in){ try{ this.inputStream = in; } finally{ inputStream.close(); } } 创建测试对象后,传递给讲师的输入流是否立即关闭?或者当测试对象被破坏时,它是否关闭?我不知道如何在C++中实现类似于析构函数的东西。p> 它作为构造函数的一部分执行。构造函数中执行的代码只是普通代码,没有奇怪的控制流

例如:

/**
 * Constructor
 */
public Test(InputStream in){
   try{
      this.inputStream = in;
   } finally{
      inputStream.close();
   }
}

创建测试对象后,传递给讲师的输入流是否立即关闭?或者当测试对象被破坏时,它是否关闭?我不知道如何在C++中实现类似于析构函数的东西。p> 它作为构造函数的一部分执行。构造函数中执行的代码只是普通代码,没有奇怪的控制流。(我的意思是在调用超类构造函数和运行变量/实例初始值设定项之后。)

在java中没有等价的C++析构函数。最接近的是A,但不应该用作C++析构函数的等价物。(您几乎不应该编写终结器。在某些情况下,它们在关机时不被调用,并且被称为非确定性终结器。)

在您给出的例子中,您可能不希望您的类承担关闭输入流的责任-通常打开流的代码也负责关闭它。但是,如果您确实希望对此负责,或者只是为了方便调用方,那么您可能希望公开一个只关闭流的
close()
方法。您可能还需要实现,以便调用方可以在类中使用:

try (Test test = new Test(new FileInputStream("foo.txt")) {
    // Do stuff with test
}

这将在
try
块结束时自动调用
test.close()

最后将在try之后立即执行。它在构造函数中并不重要。它在中有很好的定义

它说:

带有finally块的try语句通过首先执行try块来执行。还有一个选择:

  • 如果try块的执行正常完成,则 执行块,然后有一个选项:
    • 如果finally块正常完成,则try语句
      正常完成
    • 如果finally块由于原因S而突然完成,则try 由于S的原因,语句突然完成

相关的:现有的答案是足够的,但也要考虑让您的类实现<代码>可关闭< /代码>,并在基础输入流上调用<代码>关闭()/代码>:@ CyyKnDALL。谢谢,我认为我最好为我的案例实现可关闭的。