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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 昝文萌 中级黑马   /  2013-8-16 10:54  /  1652 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 昝文萌 于 2013-8-16 17:56 编辑
  1. <div class="blockcode"><blockquote>class Person
  2. {
  3.           static String name;
  4.           int age;

  5.            public void show()
  6.            {
  7.             }
  8. }

  9. classs  Demo
  10. {
  11.           public static void main()
  12.            {
  13.                       Person p=new Person();
  14.                       p.show();

  15.             }
  16. }
复制代码
就是有一点不明白,当还没有创建对象时,这个Person类和他的静态成员变量name是什么时间被加载到方法区的,是在执行主函数时,还是执行Person p语句时?这个类的生命周期又是什么时间结束的?

评分

参与人数 1技术分 +1 收起 理由
张智文 + 1

查看全部评分

3 个回复

倒序浏览
1.name是静态成员,是共享数据,在类加载的时候存在方法区中,当你一创建类person类时,就会加载到方法区
2.类通过类加载器加载到内存中,当该类所有的实例都已经被回收,也就是java堆中不存在该类的任何实例,生命周期就到了就会被卸载。

回复 使用道具 举报
参考了网上的其他资料,理解如下:
1、类和静态成员是在class文件被类加载器加载进内存后就存放到方法区中。类加载的最终产品是位于堆区的java.lang.Class对象。Class对象封装了类在方法区的数据结构。
2、关于类的卸载:
该类所有的实例都已经被回收,也就是java堆中不存在该类的任何实例。
加载该类的ClassLoader已经被回收。
该类对应的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法。
        如果以上三个条件全部满足,jvm就会在方法区垃圾回收的时候对类进行卸载,类的卸载过程其实就是在方法区中清空类信息,java类的整个生命周期就结束了。

评分

参与人数 2技术分 +1 黑马币 +10 收起 理由
田磊阳 + 1
昝文萌 + 10 很给力!

查看全部评分

回复 使用道具 举报
person类不是静态类,所以不会加载到方法区,当new一个person对象时,person加载到了堆内,它的静态成员name被加载到方法区中,注意,可不是person p操作哦;
一个对象,当没有引用指向它时,它的生命周期就结束了,但它占用的空间并不一定被回收。这事是垃圾回收机制说了算。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马