A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘士林 中级黑马   /  2012-11-5 22:58  /  1380 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

静态成员随类的加载而存在,周期最长,那类和静态成员什么时候消失?,类存在于那个区域?
非静态成员随对象的创建而存在,,什么时候才释放内存?
局部变量在方法结束后就消失,那么要用局部变量的结果的话,岂不用不到?
对这块不是很明白,请指教,多谢!

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

2 个回复

倒序浏览
静态成员随类的加载而存在,周期最长,那类和静态成员什么时候消失?
当JVM结束运行后消失。
类存在于那个区域?
类被加载到方法区,且只加载一次。

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

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

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

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
本帖最后由 吴愿涛 于 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,编译器无从知道这个变量是属于哪一个类的。静态变量是类相关的变量,所以他的生命周期是从这个累被声明,到这个类彻底被垃圾回收机制彻底回收才会被销毁。
    实例变量是这个类的对象里的变量,它和静态变量不同,它只能由创建出的对象来调用,所以实例变量是从这个对象(其实就是实例)被创建开始,直到这个对象没有任何引用变量去引用它,最终被垃圾回收站回收,这时这个实例变量也跟着就消失了。
   
总而言之:静态变量生命周期就是类的开始和销毁
                      实例变量生命周期就是对象的开始和销毁。‘
其实用的时间久了 ,有时候不经意间就懂了呵呵

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马