我是Java新手,在高中时期有一些C ++背景。 现在我正在努力创造一些东西,我选择Java作为编程语言。

我完成了我的作业,看了很多关于Java的“析构函数”, finalize()方法和close()shutdown()方法。 但我仍然认为我不知道这应该如何工作(当然下面有更多信息)

好的,具体的问题是为什么我需要调用close()shutdown()方法?

在我的特定情况下,我正在使用一个我没有开发处理智能卡读卡器的类,但我已经看到文件管理的情况,你必须调用close()方法,将类似。

不是调用close()方法与在C ++中释放内存的想法相同(那很糟糕)? 意思是,我必须处理对象的删除或破坏......不是GC的用途吗?

我试图用于智能卡读卡器的类不是最好的选项可能是一个选项,这个类实现finalize()方法可能更好,所以当不再使用并准备好GC时,释放内存(很可能是本机代码)和/或释放GC可能不知道如何操作的硬件资源。

但是文件管理类呢? 那些是非常常用和维护的,为什么仍然需要close()方法? 我理解存在的目的,解锁文件,但为什么我要记得关闭它? 一旦不再使用该对象,则至少在最常见的情况下自动解锁文件。

最后,使用实现finalize()方法的类来包装需要关闭或关闭的类是否是一个正确的解决方法,我调用close()shutdown()方法?

我已经看到finalize()方法不是很受欢迎,所以这就是我问这个问题应该如何解决的原因。

提前致谢

胡安

PS:我见过的:

是否有Java的析构函数?

你为什么要实现finalize()?

http://www.codeguru.com/java/tij/tij0051.shtml

用Layman的术语解释Java中的close()方法

我需要关闭我执行File.getName()的文件吗?

===============>>#1 票数:3 已采纳

大多数类将在其finalize方法中清理它们的外部资源,但这与C ++的析构函数不同 - 只要不再使用对象就会调用析构函数,但在对象是垃圾之前不会调用终结符。收集,你不知道什么时候会发生这种情况(如果你没有内存密集型程序,它可能永远不会发生)。 所以,假设您正在分配一堆对象,每个对象都分配一个数据库连接(是的,您应该使用连接池,但这是假设的); 你使用每个对象,然后将它的引用归零,这样它就可以在没有先关闭它们的数据库连接的情况下进行垃圾收集,现在你的数据库就会被废弃,因为它有太多的连接打开了。 你可以调用System.gc ,希望这会清理连接,但这只是垃圾收集器的一个建议,它执行一个集合,你的垃圾数据库连接的终结器可能不够智能完全清理连接。

简而言之,您需要调用closeshutdown因为您不知道对象的终结器是否/何时将运行,并且您不知道它们在清理外部资源方面有多好。

顺便说一下,你应该使用try-catch-finally块来确保你调用closeshutdown - 把方法放在finally块中。 或者,如果您使用的是Java7,请使用try-with-resources。

===============>>#2 票数:2

java垃圾收集器会为你工作,但在某些情况下(使用套接字或数据库连接)你需要调用close方法(例如关闭与数据库的连接,或文件处理程序等)。

有人调用连接的close()方法,然后将其转换为null,如:

conn.close();
conn = null;

然后他们将它射入头部,以表明它已经死了。

===============>>#3 票数:1

Java的垃圾收集会自动释放不再引用的内存。

它不会释放其他资源。 因此,您需要一种显式方法来释放其他资源。

好的,具体的问题是为什么我需要调用.close或.shutdown方法?

释放未自动处理的资源。

我理解存在的目的,解锁文件,但为什么我要记得关闭它?

如果您使用Java 7的try-with-resources ,则不必这样做。

最后,使用实现finalize方法的类包装需要关闭或关闭的类是否是一个正确的解决方法,我在那里调用close或shutdown方法?

不能。在不再引用对象之后,您不能依赖很快调用的finalize()方法。

===============>>#4 票数:1

存在许多类来封装外部实体的服务。 在许多情况下,一个类的有用性将取决于它要求外部实体代表它做某事直到另行通知为止 ,可能对该实体的其他潜在用户造成损害。 要求外部实体代表其行事直至另行通知的类别承担了在不再需要其服务时通知外部实体的责任。

调用close()会告诉对象不再需要其服务; 因此,(不再需要的)对象可以将消息传递给代表它的实体,即它们也不需要它们的服务。 然后,此类通知可允许这些实体向其他潜在用户提供其服务。

垃圾收集操作的假设是系统知道它何时需要内存,并且在系统用于可以释放的内存之前,除去垃圾没有任何实际好处。 这种哲学并不适用于大多数使用close东西。 在许多情况下,拥有资源的代码无法知道是否有其他人可能想要使用它。 因此,代码通常应该仅在实际使用它们的持续时间内保留资源。 一旦代码完成了资源,它应该释放它,以便让任何可能需要它的人都可以使用它。

  ask by user2292570 translate from so

未解决问题?本站智能推荐: