繁体   English   中英

Java静态实例和参考

[英]Java static instances and references

我有单身人士班。 还有一个使用单例实例的类。 像下面这样:

class A {
    SingletonDemo obj = SingletonDemo.getInstance() ;
. 
. 
. 
} 

现在,我知道SingletonDemo类中的SingletonDemo实例的生命周期是该程序的生命周期。

但是,A类中obj的生存期如何? 当控件从类A退出时会被垃圾回收吗?还是在整个程序的生命周期中仍然存在?

  • Java的规范规定的范围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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM