我有一个类看起来像:
public class BadCodeStyle {
private static String theAnswer = null;
public static void setAnswer(String whatsNew) {
theAnswer = whatsNew;
}
public static String getAnswer() {
return (theAnswer == null) ? "I don't know" : theAnswer;
}
}
当然这是对实际课程的简化。真正发生的是静态方法如果变量为null则检索框架对象。设置变量只是为了在测试运行中插入一个模拟值,我希望将代码与框架隔离开来(为可测试性改造代码很有趣 - 就像戳你自己的眼睛类型的乐趣一样)。
当我BadCodeStyle.setAnswer("42")
时,静态方法的行为类似于Singleton(?)。我确实阅读了classloader explanation并得出结论:只要加载了类,变量就会保留,只要JVM运行就可以了?这是对的吗?
答案 0 :(得分:7)
只要加载了类定义,静态类变量就会生效。这通常是在VM退出之前。但是,还可以通过其他方式卸载类。例如,请参阅this thread和this one。
答案 1 :(得分:-1)
静态变量更精确地对所有对象(共享)都是通用的。它不属于任何类(对象)的实例。所以很明显它不能用对象进行垃圾收集。
class X
{
static string str;
}
X obj1 = new X();
X obj2 = new X();
当你定义X.str编译器时,请说用类引用替换。
但它属于Class对象。我们也把它称为类变量。 (classloader加载类) 所以它的单个变量(单例实际上是一个使用单个对象的模式[使用私有构造函数并使用方法返回该单个对象])
当您阅读时,只有在程序完成后才会回收内存。 [strong>它没有得到(回收)垃圾收集之间[未使用的对象'将被正常垃圾收集]。
所以只要流程存在,它的生命周期就存在 [程序正在运行]。
结帐生命周期的变量:www.cs.berkeley.edu/~jrs/4/lec/08