黑马程序员技术交流社区
标题:
关于类生命周期的问题
[打印本页]
作者:
昝文萌
时间:
2013-8-16 10:54
标题:
关于类生命周期的问题
本帖最后由 昝文萌 于 2013-8-16 17:56 编辑
<div class="blockcode"><blockquote>class Person
{
static String name;
int age;
public void show()
{
}
}
classs Demo
{
public static void main()
{
Person p=new Person();
p.show();
}
}
复制代码
就是有一点不明白,当还没有创建对象时,这个Person类和他的静态成员变量name是什么时间被加载到方法区的,是在执行主函数时,还是执行Person p语句时?这个类的生命周期又是什么时间结束的?
作者:
七宝
时间:
2013-8-16 11:52
1.name是静态成员,是共享数据,在类加载的时候存在方法区中,当你一创建类person类时,就会加载到方法区
2.类通过类加载器加载到内存中,当该类所有的实例都已经被回收,也就是java堆中不存在该类的任何实例,生命周期就到了就会被卸载。
作者:
清心玉质
时间:
2013-8-16 13:00
参考了网上的其他资料,理解如下:
1、类和静态成员是在class文件被类加载器加载进内存后就存放到方法区中。类加载的最终产品是位于堆区的java.lang.Class对象。Class对象封装了类在方法区的数据结构。
2、关于类的卸载:
该类所有的实例都已经被回收,也就是java堆中不存在该类的任何实例。
加载该类的ClassLoader已经被回收。
该类对应的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法。
如果以上三个条件全部满足,jvm就会在方法区垃圾回收的时候对类进行卸载,类的卸载过程其实就是在方法区中清空类信息,java类的整个生命周期就结束了。
作者:
单凯
时间:
2013-8-16 13:44
person类不是静态类,所以不会加载到方法区,当new一个person对象时,person加载到了堆内,它的静态成员name被加载到方法区中,注意,可不是person p操作哦;
一个对象,当没有引用指向它时,它的生命周期就结束了,但它占用的空间并不一定被回收。这事是垃圾回收机制说了算。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2