class OuterClass {
static int j=99;
static class InnerClass {
public void doSomething() {
while(true)
OuterClass.j= 100;
}
}
}
}
使用上面的代码,当OuterClass需要垃圾收集时,垃圾收集是否有任何问题,但是让我们说doSomething引用静态变量会是一个问题吗?我所关心的是内部类通过访问变量j来引用外部类,并且我想知道这是否会影响作为GC的OuterClass。
答案 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 静态嵌套类不能直接引用实例变量或 在其封闭类中定义的方法:它只能通过它来使用它们 对象引用。
注意:静态嵌套类与其实例成员交互 外部类(和其他类)就像任何其他顶级类一样。 实际上,静态嵌套类在行为上是顶级类 已经嵌套在另一个顶级类中进行打包 便利性。