我经常看到像这样的代码,其中开发人员在一个作用域内创建了另一个作用域。 我能想到几个原因: 1. 隐藏封装作用域的变量,使它们被隔离。(这也将允许声明相同名称的变量) 2. 允许在范围1中分配的内存在其关闭时进行垃圾回收。 然而,我认为以上任何一个原因都不足以做到这一点... 这样做的目的是什么?
根据Java语言规范所述,声明的作用域是程序中可以使用该声明实体的区域,只要它可见(§6.4.1)。换句话说,作用域仅调节源代码中名称的使用。它对运行时行为没有影响,因此不会影响垃圾回收。块通常只有在您需要实现第一种建议时才使用,但有时会变得过于繁琐。就个人而言,在我编写的代码中可能只使用了一两次。 垃圾收集部分由类实例的终结定义。该章节讲述了可达性。 可达对象是指任何可以从任何活动线程中访问的对象。 JVM无法收集这些对象。 JLS还提到: 可以设计优化程序转换,将可达对象数量减少到比那些天真地被认为是可达的的对象更少。例如,Java编译器或代码生成器可以选择将不再使用的变量或参数设置为null,以使该对象的存储可以更早地被回收。 这也在当Java对象仍在作用域内时,它是否可以完成最终处理?的答案中讨论。