java 最佳实践 -outer class 内部 class 访问的静态变量

java best practice -outer class static variable accessed by inner class

class OuterClass {
    static int j=99;

    static class InnerClass {

        public void doSomething() {
            while(true)
                OuterClass.j= 100;
            } 
        }
    } 
}   

使用上面的代码,当 OuterClass 需要进行垃圾收集时,垃圾收集是否存在任何问题,但可以说 doSomething 正在引用一个静态变量,这会是一个问题吗?我关心的是内部 class 通过访问变量 j 引用了外部 class 并且我想知道这是否会影响 OuterClass 被 GC。

虽然您将其命名为InnerClass,但它不是内部class。它只是一个 static 嵌套 class。

此类 class 的实例没有引用封闭 class 的任何实例。此外,您正在引用封闭 class 的 static 字段。绝对没有引用 OuterClass 的任何实例。

您的 InnerClass 中的任何内容都无法阻止 OuterClass 类型的实例被垃圾回收。

我是不是误解了你的问题?您是在询问 classes 是否被垃圾收集?

类 不受 GC 的影响,对象会。如果您创建一个 InnerClass 类型的对象,GC 将不会触及它所引用的任何内容。但是,因为您只是引用一个静态变量,所以您没有引用任何 OuterClass 类型的对象(无论如何在该代码片段中)。因此,GC 可以自由删除任何不需要的 OuterClass 类型的对象,而不会以任何方式影响 InnerClass 类型的对象的功能。

请注意,如果您所做的只是从 InnerClass 引用 OuterClass 中的静态变量,您可能不应该将 InnerClass 定义为嵌套 class。

由于j字段是静态的,它的存在超出了OuterClass的单​​个实例的范围。 InnerClass 是静态的这一事实将它与 OuterClass 的任何实例分离。

As with class methods and variables, a static nested class is associated with its outer class. And like static class methods, a static nested class cannot refer directly to instance variables or methods defined in its enclosing class: it can use them only through an object reference.

Note: A static nested class interacts with the instance members of its outer class (and other classes) just like any other top-level class. In effect, a static nested class is behaviorally a top-level class that has been nested in another top-level class for packaging convenience.

Nested classes explained in the Java tutorial