非静态类的静态对象存在周期
来源:学生作业帮 编辑:大师作文网作业帮 分类:综合作业 时间:2024/11/11 22:07:12
非静态类的静态对象存在周期
一个j2ee应用,后台有个极简单的单例代码
public class A{
private static A a;\x05
private A() {}
public static A getInstance(){
\x05 if (a== null) {
\x05\x05a= new A();
\x05return a;
}
}
假设前台所有的访问请求都会走到A.getInstance().
第一次访问后,new一个新对象a.
以后对象a就一直存在了么?可是这个类A不是静态的啊,难道非静态的类A也会常驻在JVM?
一个j2ee应用,后台有个极简单的单例代码
public class A{
private static A a;\x05
private A() {}
public static A getInstance(){
\x05 if (a== null) {
\x05\x05a= new A();
\x05return a;
}
}
假设前台所有的访问请求都会走到A.getInstance().
第一次访问后,new一个新对象a.
以后对象a就一直存在了么?可是这个类A不是静态的啊,难道非静态的类A也会常驻在JVM?
楼主对于静态类这个概念似乎有些误解.
在java中,static关键字唯一可以用在类定义上是如下一种写法:
public class A{
static class B{}
static class C{}
}
如上static修饰的class必须是内部类.
然而,不同于普通的Inner class.这种静态内部类不能互相访问实例变量.B,C可以看做仅仅是在A类(包)下面的两个独立类B.java,C.java.
最后解决一下楼主的疑惑.对象实例的声明周期取决于它的作用域,这里使用static指针长期指向单例实例.只要jvm不卸载A类(事实上通过底层操作可以做到卸载的),static的强指向不会消失,只要内存实例仍然有强引用存在,它就不会被jvm回收.
相关的请楼主恶补下基础知识吧.:)
在java中,static关键字唯一可以用在类定义上是如下一种写法:
public class A{
static class B{}
static class C{}
}
如上static修饰的class必须是内部类.
然而,不同于普通的Inner class.这种静态内部类不能互相访问实例变量.B,C可以看做仅仅是在A类(包)下面的两个独立类B.java,C.java.
最后解决一下楼主的疑惑.对象实例的声明周期取决于它的作用域,这里使用static指针长期指向单例实例.只要jvm不卸载A类(事实上通过底层操作可以做到卸载的),static的强指向不会消失,只要内存实例仍然有强引用存在,它就不会被jvm回收.
相关的请楼主恶补下基础知识吧.:)