黑马程序员技术交流社区

标题: 关于类,对象,变量的生命周期问题 [打印本页]

作者: 刘士林    时间: 2012-11-5 22:58
标题: 关于类,对象,变量的生命周期问题
静态成员随类的加载而存在,周期最长,那类和静态成员什么时候消失?,类存在于那个区域?
非静态成员随对象的创建而存在,,什么时候才释放内存?
局部变量在方法结束后就消失,那么要用局部变量的结果的话,岂不用不到?
对这块不是很明白,请指教,多谢!
作者: 王振    时间: 2012-11-5 23:20
静态成员随类的加载而存在,周期最长,那类和静态成员什么时候消失?
当JVM结束运行后消失。
类存在于那个区域?
类被加载到方法区,且只加载一次。

非静态成员随对象的创建而存在,,什么时候才释放内存?
在堆中创建的对象,在没有引用指向它时,还好存在于堆内存中,知道垃圾回收器将其清走。至于垃圾回收器何时回收,不确定。

局部变量在方法结束后就消失,那么要用局部变量的结果的话,岂不用不到?

对局部变量,在局部以外的地方确实无法用到。但变量是你定义的,如果你想要在这个局部以外的地方用它,就不要把它定义为局部变量。


作者: 奋斗的青春    时间: 2012-11-5 23:23
本帖最后由 吴愿涛 于 2012-11-5 23:25 编辑

1.存储区域不同:静态变量存储在静态存储区,普通变量存储在堆中;
2.静态变量与类相关,普通变量则与实例相关,说细一点:
class Demo {
public static String a;
public String b;
public static void main(String[] args) {
   Demo d = new Demo();
   d.a; // 警告,虽然可以通过编译,但没有意义
   d.b; // 正确
   Demo.a; // 对static变量的正确引用
   Demo.b; // 错误
}
3.内存分配方式不同。static字段对每个类来说都只有一份,无论你创建多少对象,该static区域都只有一份,它对于这些对象来说是共享的;而非static字段,因为其从属于对象,因此每有一个对象,就会为该变量申请一个存储空间;
4.生命周期不同。从程序运行开始,static域就已经确定下来,因此在没有创建对象之前,就可以引用该区域变量及函数,而非static域的变量及函数,必须等实例化之后才可以通过对象来调用。
5.理解了this之后,更能体会到static的含义。static方法就是没有this的方法,这也就是为什么在static方法中不能引用非static变量,因为该方法内没有隐含的this,编译器无从知道这个变量是属于哪一个类的。静态变量是类相关的变量,所以他的生命周期是从这个累被声明,到这个类彻底被垃圾回收机制彻底回收才会被销毁。
    实例变量是这个类的对象里的变量,它和静态变量不同,它只能由创建出的对象来调用,所以实例变量是从这个对象(其实就是实例)被创建开始,直到这个对象没有任何引用变量去引用它,最终被垃圾回收站回收,这时这个实例变量也跟着就消失了。
   
总而言之:静态变量生命周期就是类的开始和销毁
                      实例变量生命周期就是对象的开始和销毁。‘
其实用的时间久了 ,有时候不经意间就懂了呵呵






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2