[英]Java static instances and references
我有单身人士班。 还有一个使用单例实例的类。 像下面这样:
class A {
SingletonDemo obj = SingletonDemo.getInstance() ;
.
.
.
}
现在,我知道SingletonDemo类中的SingletonDemo实例的生命周期是该程序的生命周期。
但是,A类中obj的生存期如何? 当控件从类A退出时会被垃圾回收吗?还是在整个程序的生命周期中仍然存在?
obj in class A
是整个身体A
: 由类类型C(第8.1.6节)声明或继承的成员m的声明的范围是C的整个主体,包括任何嵌套的类型声明。 参见JLS 6.3
这意味着如果控件退出类A
则将对垃圾回收obj
进行引用。
Java编程语言的实现可以卸载类。 如第12.6节所述,仅当垃圾回收器可以回收定义的类加载器时,才可以卸载类或接口。 请参阅卸载类和接口
如果我正确理解,则类是单例,意味着整个应用程序中只有一个实例,但这并不意味着如果根本不引用它,则该类将在应用程序的生命期内可用。
现在,我知道SingletonDemo类中的SingletonDemo实例的生命周期是该程序的生命周期。
问题的这部分就是答案。
由于下面的代码行并未创建新对象,因此仅创建了引用SingleTon对象的class A
的引用属性。
SingletonDemo obj = SingletonDemo.getInstance() ;
因此obj
对SingleTon的生存时间没有影响。
您可以想象A.obj
是一块内存-内存中包含类A
的实例的一部分-该内存中包含对SingletonDemo
实例的引用 。
obj
本身不能被垃圾收集; 当指向该实例的SingletonDemo
实例不再存在有效引用时(例如,从不对Singleton进行引用),可能是垃圾回收。
当类A
的实例被垃圾回收时,存储obj
引用的内存将被丢弃。
obj
只是对SingletonDemo
类内相同静态实例的引用。 只有当两个引用都不再可用时,该对象才会被垃圾回收。 并且由于SingletonDemo
类内部的Referenc是静态的,因此它将保留在内存中,直到程序退出。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.