java最佳实践 - 由内部类访问的外部类静态变量

时间:2015-02-25 18:06:17

标签: java garbage-collection inner-classes

class OuterClass {
    static int j=99;

    static class InnerClass {

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

使用上面的代码,当OuterClass需要垃圾收集时,垃圾收集是否有任何问题,但是让我们说doSomething引用静态变量会是一个问题吗?我所关心的是内部类通过访问变量j来引用外部类,并且我想知道这是否会影响作为GC的OuterClass。

3 个答案:

答案 0 :(得分:5)

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

此类的实例没有引用封闭类的任何实例。更重要的是,您引用了封闭类的static字段。绝对没有任何OuterClass实例的引用。

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

我是否误解了你的问题?你在问垃圾收集课程吗?

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

  

与类方法和变量一样,静态嵌套类是   与其外层相关联。和静态类方法一样,a   静态嵌套类不能直接引用实例变量或   在其封闭类中定义的方法:它只能通过它来使用它们   对象引用。

     

注意:静态嵌套类与其实例成员交互   外部类(和其他类)就像任何其他顶级类一样。   实际上,静态嵌套类在行为上是顶级类   已经嵌套在另一个顶级类中进行打包   便利性。

Nested classes explained in the Java tutorial